发表于:2005-06-24 19:33:00
楼主
西门子S7-200PLC用ModBus协议归纳
黄自强归纳 2005-6-24
abcd123_gzb@21cn.net Tel:13808888364
图片不好夹,以PDF文件另附
近日,本人做了个S7-226 做从站的ModBus测试。总结如下:
器材::S7-226 Plc(从站) + PG/PPI编程电缆 + 手提电脑(主站)
软件:1. MicroWin4.0 Sp1 2. Commix V1.2
S7-226里的梯形图程序如下:
转成语句表程序则如下:
//初始化ModBus
LD SM0.1
CALL MBUS_INIT:SBR1, 1, 12, 9600, 0, 0, 128, 32, 1000, &VB0, M10.0, MB11
//服务主站来的请求
LD SM0.0
CALL MBUS_SLAVE:SBR2, M10.1, MB12
从上面的程序可看出,PLC的站号为12。
手提电脑安装Commix V1.2 ,它是可由程序自己添加CRC校验的串口调试软件。
用原装PG/PPI编程电缆连接手提电脑Com1口和S7-200的Port0。
编程电缆拨码开关Bit1…8=01000000
为测试方便把S7-226置I0.2=On。Q0.3强制On。Vb0...Vb9=0…9
为此要先把PLC拨到Stop状态来,运行MicroWin来设置。如下页图:
设完后退出MicroWin 以腾出Com口。
PLC拨回到Run状态来运行上述的程序。
运行Commix V1.2 ,点枕余校验,设为ModBud CRC,起始字节=1,如下图:
我用的是com1, 波特率=9600, 校验位=N无, 停止位=1输入和显示都是HEX,
如下页图:
然后点”打开串口”。
假如我现在要读输入点I0.0到I1.7。键入0c 02 00 00 00 10,则Commix自己算出CRC校验码并发出:
0c 02 00 00 00 10 78 DB
| | | | |__78 DB = CRC校验码。
| | | |_______ 00 10 = 十进制16,即长度为16Bit。高字节在前,低字节在后。
| | |____________00 00 = 起始地址。高字节在前,低字节在后。
| |_______________ 02= 功能号。
|_________________ 0c = 十进制12, 站号。
50ms后收到 PLC回答
0c 02 02 04 00 96 B9
| | | | ____ 78 DB = CRC校验码。
| | | |_______ 04即I0.7…I0.0 = 00000100,00即I1.7…I1.0= 00000000。低字节在前,高字节在后。
| | |___________ 02 = 后跟数据长度2字节。
| |_____________ 02= 功能号。
|________________ 0c = 十进制12, 站号。
可见正确读出了I0.2=1。
如下页图:
S7-200的ModBus格式如下:
S200站号 功能号 n个x数据 CRC校验
功能号1:读取单个/多个线圈(Q输出)的打开/关闭状态。
例:读Q1.7到Q0.0。
Commix发出:
0c 01 00 00 00 10 3C DB
| | | | |__3C DB = CRC校验码。
| | | |_______ 00 10 = 十进制16,即长度为16Bit。高字节在前,低字节在后。
| | |____________00 00 = 起始地址。高字节在前,低字节在后。
| |_______________ 01= 功能号。
|_________________ 0c = 十进制12, 站号。
41ms后收到 PLC回答
0C 01 02 08 00 93 FD
| | | | |___93 FD = CRC校验码。
| | | |______ 08即Q0.7…Q0.0 = 00001000, 00即Q1.7…Q1.0= 00000000。低字节在前,高字节在后。
| | |__________ 02 = 后跟数据长度2字节。
| |_____________01= 功能号。
|_______________ 0c = 十进制12, 站号。
功能号2:读取单个/多个接触点(I输入)的打开/关闭状态。
例:读I1.7到I0.0。
Commix发出:
0c 02 00 00 00 10 78 DB
| | | | |__78 DB = CRC校验码。
| | | |_______ 00 10 = 十进制16,即长度为16Bit。高字节在前,低字节在后。
| | |____________00 00 = 起始地址。高字节在前,低字节在后。
| |_______________ 02= 功能号。
|_________________ 0c = 十进制12, 站号。
50ms后收到 PLC回答
0c 02 02 04 00 96 B9
| | | | ____ 78 DB = CRC校验码。
| | | |_______ 04即I0.7…I0.0 = 00000100,00即I1.7…I1.0= 00000000。低字节在前,高字节在后。
| | |___________ 02 = 后跟数据长度2字节。
| |_____________ 02= 功能号。
|________________ 0c = 十进制12, 站号。
功能号3:读取单个/多个V储存器的值,一次最多读取120个字。
例:读Vb4到Vb13共10个字节。
Commix发出:
0C 03 00 02 00 05 25 14
| | | | |__25 14 = CRC校验码。
| | | |_______00 05=读起始地址后的5个字。高字节在前,低字节在后。
| | |____________00 02 =从库调用MBUS_INIT时设的HoldStart后的2个字起,此处=0+2x2=Vw4.
| |_______________ 03= 功能号。
|_________________ 0C = 十进制12, 站号。
40ms后收到 PLC回答
0C 03 0A 04 05 06 07 08 09 00 00 00 00 62 DD
| | | | |____ 62 dd = CRC校验码。
| | | |_______Vb4=04,Vb5=05 Vb6=06,Vb7=07,Vb8=08,Vb9=09…vb13=00。低字节在前,高字节在后。
| | |___________ 0A =十进制10.后跟数据长度10字节。
| |_____________ 03= 功能号。
|________________ 0C= 十进制12, 站号。
功能号4:读取单个/多个模拟输入 (AIW)。
本人没试过。
功能号5:写入单个线圈(Q输出)。它并非强制的,程序可以覆盖掉Modbus请求写入的数值。
例:要把Q0.1=On。
Commix发出:
0C 05 00 01 FF 00 DC E7
| | | | |__DC E7 = CRC校验码。
| | | |_______ 只有2 种取值:FF 00 = On , 00 00 = Off。
| | |____________00 01 =Q0.1, Q输出点的地址。高字节在前,低字节在后。
| |_______________ 05= 功能号。
|_________________ 0c = 十进制12, 站号。
40ms后收到 PLC回答
0C 05 00 01 FF 00 DC E7
| | | | |__DC E7 = CRC校验码。
| | | |_______ 只有2 种取值:FF 00 = On , 00 00 = Off。
| | |____________00 01 =Q0.1, Q输出点的地址。高字节在前,低字节在后。
| |_______________ 05= 功能号。
|_________________ 0c = 十进制12, 站号
同时Q0.1亮起。
功能号6:写入单个V储存器字。
例:要把Vb8写成AA, Vb9写成BB。
Commix发出:
0C 06 00 04 AA BB F7 C5
| | | | |__F7 C5 = CRC校验码。