开发协议 %e5%bc%80%e5%8f%91%e5%8d%8f%e8%ae%ae
您现在的位置:首页 > 开发协议 > 以太网【SDK】【SOCKET】上位机主动连接控制器通迅协议-网络开关、中控主机、等通迅协议教程

使用教程

下载中心

以太网【SDK】【SOCKET】上位机主动连接控制器通迅协议-网络开关、中控主机、等通迅协议教程

发布时间:2019/10/19 开发协议 浏览:2845

详细参数

开关控制SDK开发协议:获取和修改设备开关状态的指令
设备其它数据操作SDK开发协议下载地址:以太网协议

此版本为:FW2,第二版最新版本。


TCP上位机主动连接到设备的2000号端口

连接之后,设备会自动上报最新的输入,输出,和实时时间信息。

上报格式以以下协议描述的应答格式相同。


【线圈】表示输出的通道
1, 修改某一路开或关

发送格式:00 00 00 00 00 06 01 05 02 线圈 开关 00
00 00 00 00 00 06 01 05 02
线圈起始地址 开关标记(FF 00 结尾 00
例如:
开第一路: 00 00 00 00 00 06 01 05 02
00 FF 00
关第一路: 00 00 00 00 00 06 01 05 02
00 00 00
开第二路: 00 00 00 00 00 06 01 05 02
01 FF 00
关第二路: 00 00 00 00 00 06 01 05 02
01 00 00
红色部分为输出的地址, 以十六进制表示, 00 表示第一路, 01 表示第二路, 02 表示第三路, 0A 表示第
十一路, 0B 表示第十二路, 0F 表示第 16 路, 10 表示第 17 路, 以此类推。
蓝色部分表示开关标记, FF 表示开,00 表示关。


2, 读取某几路状态
与第 5 条指令作用相同, 读取的数量可变
发送格式:
00 00 00 00 00 06 01 01 02 线圈 00 数量

00 00 00 00 00 06 01 01 02 线圈起始地址 00 读取数量
返回格式:
00 00 00 00 00 【数据总数+3】 01 01【数据总数】 【数据第一字节】 【数据第二字节】 【数据第三字节】……
例如:从第一路开始, 读取 10 路: 00 00 00 00 00 06 01 01 02 00 00 0A
红色的部分为需要读取的首地址, 以十六进制表示, 00 表示第一路, 01 表示第二路, 02 表示第三路, 0A 表
示第十一路, 0B 表示第十二路, 0F 表示第 16 路, 10 表示第 17 路, 以此类推。
蓝色的部分为读取的总共数量, 以十六进制表示, 00 表示读取 0 路, 01 表示读取 1 路, 02表示读取 2 路,
0A 表示读取 10 路, 0B 表示读取 11 路, 0F 表示读取 15 路, 10 表示读取 16路, 以此类推。设备返回
应答
00 00 00 00 00 05 01 01 02 ff 03,返回应答红色部分 02 表示读取到 2 个字节数据, 紧跟
着的 FF 03 表示线圈状态, 使用十六进制表示, 读取到的线圈状态可能是多个字节组成,例如 AA BB CC DD …
每个字节最多表示 8 路, 两个字节表示 16 路, 3 个
字节表示 24 路, 以此类推。


3, 同时修改 32 路状态
发送格式:03 01 02 00 00 05 00 20 AA BB CC DD
蓝色部分 AA BB CC DD 一共 4 个字节, 使用十六进制表示输出的状态值, 每个字节有 8 个比
特, 每个比特表示一路输出,
4 个字节总共表示 32 路输出, 从第 1 路开始, 到第 32 路。
例如:
32 路全开: 03 01 02 00 00 05 00 20 FF FF FF FF
32 路全关: 03 01 02 00 00 05 00 20 00 00 00 00
开第 12 路, 关第 34 路: 03 01 02 00 00 05 00 20 03 00 00 00
关第 12 路, 开第 34 路: 03 01 02 00 00 05 00 20 0C 00 00 00


4, 同时取反 32 路状态, 翻转 32 路状态
发送格式 24 01 02 00 00 05 00 AA BB CC DD
蓝色部分 AA BB CC DD 一共 4 个字节, 使用十六进制表示二进制, 每个字节有 8 个比特, 每
个比特表示一路输出,
4 个字节总共表示 32 路输出, 从第 1 路开始, 到第 32 路。
例如翻转第一路:
24 01 02 00 00 05 00 01 00 00 00
例如翻转第二路: 24 01 02 00 00 05 00 02 00 00 00
例如翻转第三路: 24 01 02 00 00 05 00 04 00 00 00
例如翻转第 1356 路: 24 01 02 00 00 05 00 35 00 00 00


5, 读取 32 路状态
与第 2 条指令作用相同, 只是数量固定 32
发送格式: 01 01 02 00 00 05 00 20 00 00 00 00
返回数据: 01 01 02 01 05 00 00 XX AA BB CC DD
XX 部分忽略
蓝色部分 AA BB CC DD 一共 4 个字节, 使用十六进制表示输出的状态值, 每个字节有 8 个比
特, 每个比特表示一路输出,
4 个字节总共表示 32 路输出, 从第 1 路开始, 到第 32 路。
例如:
返回
32 路全开状态: 01 01 02 01 05 00 00 10 FF FF FF FF
返回 32 路全关状态: 01 01 02 01 05 00 00 10 00 00 00 00


读取IP参数

22 00 00 00 00 00 00

返回原始数据:

22 00 00 01 14 00 5a c0 a8 01 fa ff ff ff 00 c0 a8 01 01 c0 a8 01 01 d0 07 50 00

除去头部分,剩下的部分为IP设置数据,根据数据结构:

c0 a8 01 fa ff ff ff 00 c0 a8 01 01 c0 a8 01 01 d0 07 50 00

A                      B               C                 D               E         F

typedef struct _CmdIpConfigData

{

uint8_t   ipaddr[4];   A 表示设备的IP地址

uint8_t   netmask[4];   B 表示设备的子网掩码

uint8_t   gateway[4];  C 表示设备的默认网关

uint8_t   dns[4];  D 表示设备的DNS地址

uint16_t  port;  E 表示与设备通信的端口号

uint16_t  webport;  F 表示设备的WEB服务器的端口号(注意端口号不要重复使用,以免冲突

} CmdIpConfigData;

数据解释如下

C0 A8 01 FA 使用16进制表示,转换成10进制为: 192 168 1 250

FF FF FF 00 使用16进制表示,转换成10进制为: 255 255 255 0

C0 A8 01 01 使用16进制表示,转换成10进制为: 192 168 1 1

C0 A8 01 01 使用16进制表示,转换成10进制为: 192 168 1 1

D0 07 使用16进制表示16位整数为:0x07D0,转换成10进制为: 2000

50 00 使用16进制表示16位整数为:0x0050,转换成10进制为: 80

设置IP参数

21 00 00 01 14 00 5a c0 a8 01 fa ff ff ff 00 c0 a8 01 01 c0 a8 01 01 d0 07 50 00

与读取IP参数相似,只是头一个字节不同,数据格式相同。


设置通道名字

05 00 00 00 10 00 00 aa bb aa aa aa aa … aa

aa bb , 表示通道编码,aa,表示通道的索引,bb表示通道的类型,bb的取值为00或01,aa的取值范围是00~1F

aa aa aa aa … aa,表示通道的名字,一共20个字节字符串,以0结尾,ascii编码模式。


读取通道名字

04 00 00 00 10 00 00 aa bb aa aa aa aa … aa

aa bb , 表示通道编码,aa,表示通道的索引,bb表示通道的类型,bb的取值为00或01,aa的取值范围是00~1F

aa aa aa aa … aa,表示通道的名字,读指令这些数据忽略,

读通道名字的返回应答格式相同。


读定时器,读定时个数

06 00 00 00 00 00 00

返回数据:

06 00 00 01 02 00 02 02 00

说明:

02 00   十六进制:0x0002,十进制:2,表示设备的定时节点数量为 2,2个定时节点。


读取下一个定时节点

06 00 00 10 00 00 00

返回数据:

06 00 00 11 19 00 a2 05 00 03 02 71 07 1d 07 1e 00 71 07 1d 08 00 00 05 00 00 00 3c 00 00 00 00继续发送:06 00 00 10 00 00 00,读取下一个定时节点,返回下一个定时节点:

06 00 00 11 19 00 19 04 00 01 02 71 07 1d 13 00 00 71 07 1d 13 1e 00 dc 05 00 00 b8 0b 00 00 00继续发送:06 00 00 10 00 00 00,读取下一个定时节点,返回下一个定时节点:

06 00 00 10 19 00 54 00 56 01 42 58 00 00 00 01 00 07 58 ea f8 ef 1a c7 81 6b 80 1d 53 83 b2 40

根据第四个参数10,表示读取定时节点完毕。此数据包无效。11表示定时数据包有效。

说明:

读取定时个数之后,紧接着发送读取下一定时节点,读取到的是定时器的数据,这里定时器个数是2,所以,连续读取三次,只有前面两次才是有效的。

方框内是数据,以下是数据的结构:

typedef struct _timing_node

{

uint8_t    addr[2];  //定时端口地址编码(板上输出口地址范围为[0][0] ~ [0][16]),第路输出就是addr[0]=4,addr[1]=0

uint16_t   option;   //选项,第0位:1表示定时有效,0表示无效,第1位:1表示小循环开启,0表示关闭。第[8:11]位表示循环类型,类型值如下

//

time_type  start_time;  //循环开启时间(精确到秒,以板上实时时间为准)

time_type  end_time;    //循环关闭时间(精确到秒,以板上实时时间为准)

//

uint32_t   duty_cycle;  //小循环中打开继电器的时间周期,即使开通时间长度,毫秒为单位,最小毫秒,最长数十天(天)

uint32_t   period;     //小循环一个周期的时间长度,毫秒为单位,最小毫秒,最长数十天(天)

//记录状态

uint8_t    state;  //内部使用,写

} timing_node;

typedef struct _time_type

{

uint8_t    year;

uint8_t    mon;

uint8_t    day;

uint8_t    hour;

uint8_t    min;

uint8_t    sec;

} time_type;

定义循环类型:

#define  CYCLE_YEAR      0

#define  CYCLE_MONTH     1

#define  CYCLE_DAY       2

#define  CYCLE_HOUR      3

#define  CYCLE_MINITH    4

#define  CYCLE_SECOND    5

#define  CYCLE_WEEK      6

#define  CYCLE_USER      7

#define  CYCLE_ONCE      8

05 00 03 02 71 07 1d 07 1e 00 71 07 1d 08 00 00 05 00 00 00 3c 00 00 00 00

套用以上数据结构,第一条定时节点解释为:

  • 05 00 表示第六路输出
  • 03 02 option, 0x03,第0位为1,表示定时有效。第1位为1,表示小循环有效。高位为0x02,表示循环类型为:CYCLE_DAY,天循环类型。
  • 71 07 1d 07 1e 00start_time,71 07 1d 08 00 00end_time表示开启时间和截止时间。

转换成十进制是113 7 29 7 30 00,

转换成十进制是113 7 29 8 00 00,

然后第1,2个数据分别做运算:113+1900=2013,7+1=8,

得到2013年8月29日,7点30分00秒,到2013年8月29日,8点0分0秒。定时时间范围在这个范围之内进行小循环动作。

  • 05 00 00 00 duty_cycle,0x00000005,表示小循环开的时间为5秒,以秒位单位。
  • 3c 00 00 00 period,表示小循环的时间为0x0000003C,表示小循环的周期为60秒。

 

继续解释第二条定时节点:

  • 04 00 01 02 71 07 1d 13 00 00 71 07 1d 13 1e 00 dc 05 00 00 b8 0b 00 00 00

1, 04 00 表示第五路输出

2,01 02  option, 0x01,第0位为1,表示定时有效。第1位为0,表示小循环无效。高位为01 02,表示循环类型为:CYCLE_DAY,(天)循环类型。

3,dc 05 00 00 duty_cycle,小循环数据,这里无效。

4,b8 0b 00 00 period,小循环数据,这里无效。

5,71 07 1d 13 00 00start_time,71 07 1d 13 1e 00end_time表示开启时间和截止时间。

转换成十进制是113 7 29 19 00 00,

转换成十进制是113 7 29 19 30 00,

然后第1,2个数据分别做运算:113+1900=2013,7+1=8,

得到2013年8月29日,19点0分0秒,到2013年8月29日,19点30分0秒。定时时间范围在这个范围之内开启,没有小循环开和关动作。


写定时器,写定时个数

07 00 00 00 00 00 00 02 00

返回数据:

07 00 00 01 00 00 00

说明:

02 00 : 十六进制:0x0002,十进制:2,表示设备的定时节点数量为 2,2个定时节点。

01:        01表示写成功,00表示写失败。


写定时器,写定时节点

定时器节点的写,必须连续写入预定数据的定时节点。

根据定时器写数据结构,

typedef struct _CmdTimingNode

{

uint16_t    index;

timing_node node;

} CmdTimingNode;

构造出定时器写节点的数据:

第一次发送数据:07 00 00 10 FF 00 00 00 00 05 00 03 02 71 07 1d 07 1e 00 71 07 1d 08 00 00 05 00 00 00 3c 00 00 00 00

返回应答:07 00 00 11 00 00 00

第二次发送数据:07 00 00 10 FF 00 00 01 00 04 00 01 02 71 07 1d 13 00 00 71 07 1d 13 1e 00 dc 05 00 00 b8 0b 00 00 00

返回应答:07 00 00 11 00 00 00

说明:

00 00 01 00 表示定时器节点索引,写定时器,从索引00 00开始写,01 00 表示第二个定时节点,02 00表示第三路定时节点,03 00表示第四路定时节点,不同的定时节点使用不同的索引号。写入同一个索引号,将覆盖以前的数据。注意,索引号不代表定时通道号,比如索引01 00只是代表定时器数据占用内存第一个定时节点,输出通道号表示继电器输出的通道,按照以下定时数据规定的为准。

05 00 03 02 71 07 1d 07 1e 00 71 07 1d 08 00 00 05 00 00 00 3c 00 00 00 00

04 00 01 02 71 07 1d 13 00 00 71 07 1d 13 1e 00 dc 05 00 00 b8 0b 00 00 00

表示定时器的定时数据,跟以上读定时的描述相同,最后一个字节:00,必须保证是00。


写定时器,结束定时器写

07 00 00 20 00 00 00

返回应答:

07 00 00 21 00 00 00

说明:

20标志定时器结束写,返回21表示写结束完成。


读或写设备实时时钟

typedef struct _time_type

{

uint8_t    year;

uint8_t    mon;

uint8_t    day;

uint8_t    hour;

uint8_t    min;

uint8_t    sec;

} time_type;

设置时间:09 00 00 00 00 06 00 aa bb cc dd ee ff

读取时间:08 00 00 00 00 00 00

返回应答:08 00 00 01 00 06 00 aa bb cc dd ee ff

            或:08 00 00 01 00 06 00 aa bb cc dd ee ff

数据说明:

aa 表示year(年,比如0A(十进制是10),实际年份是1900+10 = 1910年)

bb 表示mon(月,比如 06(十进制是6),实际月份即是6+1=7月)

cc 表示day(天)

dd 表示hour(小时)

ee 表示min (分)

ff 表示sec (秒)

 

例如

发送指令:08 00 00 00 00 00 00返回08 00 00 01 06 00 00 00 00 01 00 00 00

或者发送:09 00 00 00 06 00 00 00 00 01 00 00 00

 

控制器MAC地址查询方法,一部分控制器可以通过此方法查询,通过Modbus软件查询:

控制器MAC地址查询方法,通过指令查询:

上图21 94是十进制8596转化而来,00 06读取6个字节,得到返回指令最后6位有效值。

 


定时器写注意:

  • 先写定时器数量,此指令,规定了定时器节点的内存占用数。
  • 然后按照规定写入规定数量的定时器节点,未写入的定时节点保持旧的定时节点数据,新写入的数据覆盖旧的数据。首次写必须全部写,以后再写,可以按照需要写入需要修改的定时节点。
  • 最后需要发送结束定时器写指令,完成定时器写操作,让定时器生效。
发布时间: