背景说明
该协议是根据台达研发的基于CANopen现场总线的多轴运动控制器DVP10MC11T,其内部包含标准PLC模块和MC运动控制模块两大模块。参考手册名称是《DELTA_IA-PLC_DVP-MC_OM_SC_20151026.pdf》
通讯帧
通讯采用ASCII码,校验方式采用和校验。
请求帧格式: | 起始字符 | PLC站号 | 功能码 | 起始数据地址 | 数据个数 | 和校验(两位) | 结束字符1 | 结束字符0 |
STX(:) | SLAVE(两位) | CMD(两位) | ADDRESS(四位) | LEN(四位) | SUM | ETX1(一位) | ETX0(一位) | |
例子 | STX, | SLAVE, | CMD, | ADDRESS, | LEN, | SUM, | ETX1, | ETX0, |
字符 | : | 0 1 | 0 3 | 1 0 0 0 | 0 0 0 2 | E A | CR | LF |
ASCII | 3AH, | 30H, 31H, | 30H, 33H, | 31H, 30H, 30H, 30H, | 30H, 30H, 30H, 32H, | 45H, 41H, | 0DH, | 0AH |
指令解释如下: | ||||||||
STX, | "01" | "03" | "1000" | "0002" | "EA" | "ETX1" | "ETX0" | |
报文开始 | PLC站号 | 功能码 | 地址1000H处 | 02H字长度数据 | 累加方式和校验 | 结束字符1 | 结束字符2 | |
其中 SUM=~(SLAVE+......+ETX) + 1 = ~(01H+03H+10H+00H+00H+02H)+1 = EAh |
截取附录A Modbus通讯说明
通讯命令字
通讯命令字含义: | |||
分类 | 命令字 | ||
命令 | HEX | 命令解释 | |
基本命令 | STX | 3AH | 报文开始 |
ETX1 | 0DH | 报文结束1 | |
ETX0 | 0AH | 报文结束0 | |
基本命令字 | 0x02 | 30H,32H | 读位装置寄存器 |
0x03 | 30H,33H | 读单个或多个字装置寄存器 | |
0x05 | 30H,35H | 写单个位装置寄存器 | |
0x06 | 30H,36H | 写单个字装置寄存器 | |
0x0F | 30H,46H | 写多个位装置寄存器 | |
0x10 | 31H,30H | 写多个字装置寄存器 |
16进制数据元和ASCII的转换
通讯数据地址
通讯数据地址: | |||||||
类型 | 写起始地址 | 写结束地址 | 备注 | 读起始地址 | 读结束地址 | ||
位(Bit) | S0~S1023 | 0x0000 | 0x03FF | 读写地址 | |||
X0~X377 | 0x0400 | 0x04FF | 读写地址 | ||||
Y0~Y377 | 0x0500 | 0x05FF | 读写地址 | ||||
T0~T255 | 0x0600 | 0x06FF | 读写地址 | ||||
C0~C255 | 0x0E00 | 0x0EFF | 读写地址 | ||||
M0~M1535 | 0x0800 | 0x0DFF | 读写地址 | ||||
M1356~M4095 | 0x0B00 | 0xB9FF | 读写地址 | ||||
字(Word) | T0~T255 | 0x0600 | 0x06FF | 读写地址一致 | |||
C0~C199 | 0x0E00 | 0x0EC7 | 读写地址一致 | ||||
C200~C255 | 0x0700 | 0x076F | 不一致 | 0x0EC8 | 0x0EFF | ||
D0~D4095 | 0x1000 | 0x1FFF | 读写地址一致 | ||||
D4096~D9999 | 0x9000 | 0xA70F | 读写地址一致 |
台达通讯协议举例
读取以D0为起始地址的两个连续数据。
LRC校验码为从通讯站号至最后一个数据内容的16进制数叠加后的值各位取反后再加1的值。如下的图为例计算方式为:0x01 + 0x03 + 0x10 + 0x00 + 0x00 + 0x02 = 0x16; 0x16各位取反后再加1的结果为0xEA.
返回数据帧如下:
其中D0=1; D1=2
功能描述 | 功能码与起始地址 | ASCII码数据帧 | 16进制数据帧 |
设置Y0 = 1 | 05, 0x0500 = 0xFF00 | : 01050500FF00F6 | 3A 30 31 30 35 30 35 30 30 46 46 30 30 46 36 0D 0A |
设置Y0 = 0 | 05, 0x0500 = 0x0000 | :010505000000F5 | 3A 30 31 30 35 30 35 30 30 30 30 30 30 46 35 0D 0A |
读Y0 的值 | 01, 0x0500 | :010205000008F0 | 3A 30 31 30 32 30 35 30 30 30 30 30 38 46 30 0D 0A |
设置D0 = 9 | 10, 0x1000= 0x0009 | :011010000001020009D3 | 3A 30 31 31 30 31 30 30 30 30 30 30 31 30 32 30 30 30 39 44 33 0D 0A |