一、 背景P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
2002年开始开发焦炉四大机车自动化系统(见下图)的时候,遇到了无线通信的难题,众所周知目前的电台不能直接支持PPI协议,别的的无线通信的方案要么成本过高,要么性能不稳定,不可靠。WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
所以早期的时候,都是用自由口,自己编写基于主、从通信协议的通信程序,不过很不灵活,协议一旦确定就很难更改,如果有升级和变动,都需要大量的修改代码,维护极不方便。WWW_PLCJS_COM-PLC-技.术_网
后来西门子推出了Micro Win32引入了库的概念,可以直接提供Moubus Rtu Slave库供开发人员使用,但是只提供Moubus Slave,没有提供Moubus Client,所以PLC直接通过Moubus协议访问还是有问题。——可——编——程——控-制-器-技——术——门——户
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
WWW_PLCJS_COM-PLC-技.术_网
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
二、 实施方案WW.W_PLCJS_COM-PLC-技.术_网
Modbus是一个公开协议,包括ASCII、RTU和TCP几种,很显然我选择了Rtu,因为西门子提供的Slave就是基于Rtu协议的。WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
我们知道Modbus支持好多功能,如下表:WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
WWW_PL※CJS_COM-PLC-技.术_网
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
如果在PLC中把所有的功能都实现了,不光代码编写较为繁琐,对PLC本身的程序和容量空间都是考验。所以根据需要我仅实现3和16号指令,详细的协议如下:WWW_PLC※JS_COM-PmLC-技.术_网
1、 读取保持寄存器(单个和多个,以字为最小单位)WWW_P※LCJS_COM-PLC-)技.术_网
发送命令帧:WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
W1WW_P4LCJS_COM-PLC-技.术_网
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
返回命令帧:WWW_PLCJS@_COM%-PLC-技.术_网
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
——可——编——程——控-制-器-技——术——门——户
说明:WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
命令正确:WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
1) 设备地址相同Addr0=Addr1WWW_PLCJS_COM-PLC-技.术_网
2) 功能码相同plcjs.技.术_网
3) 返回的数据字节数N=DataNum×2 DataNum的范围(0~120)P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
4) 返回数据的意义W1WW_P4LCJS_COM-PLC-技.术_网
a=HoldStartWWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
n= DataNum-1WWW_PLC※JS_COM-PmLC-技.术_网
W1WW_P4LCJS_COM-PLC-技.术_网
WWW_PL※CJS_COM-PLC-技.术_网
命令有误:WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
1) 没有任何返回WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
2) 返回异议帧P.L.C.技.术.网——可编程控制器技术门户
WWW_PL※CJS_COM-PLC-技.术_网
WWW_PL※CJS_COM-PLC-技.术_网
2、 设置保持寄存器(多个,以字为最小单位)WWW_P※LCJS_COM-PLC-)技.术_网
发送命令帧:WWW_P※LCJS_CO※M-PLC-技-.术_网
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
WW.W_PLCJS_COM-PLC-技.术_网
返回命令帧:WWW_PLCJS@_COM%-PLC-技.术_网
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
WW.W_PLC※JS_C,OM-PL,C-技.术_网
说明:WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
数据字节数:bytN= DataNum×2WWW_PLCJS@_COM%-PLC-技.术_网
WWW_PLC※JS_COM-PmLC-技.术_网
命令正确:WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
1) 设备地址相同Addr0=Addr1——可——编——程——控-制-器-技——术——门——户
2) 功能码相同——可——编——程——控-制-器-技——术——门——户
3) 地址相同——可——编——程——控-制-器-技——术——门——户
4) 数据量相同WWW.PLCJS.COM——可编程控制器技术门户
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
命令有误:WWW_P※LCJS_CO※M-PLC-技-.术_网
1) 没有任何返回WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
2) 返回异议帧W1WW_P4LCJS_COM-PLC-技.术_网
WWW_PLCJS_COM-PLC-技.术_网
WWW_PLCJS_COM-PLC-技.术_网
有了协议,有知道了西门子库的开发方法,剩下的事,就是开工,下面详细介绍最终的完成成果:P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
——可——编——程——控-制-器-技——术——门——户
Modbus RTU客户程序由于建立在PLC中,所以它的读写函数的处理方法和一般上位机的读写程序不一样,PLC内部的程序执行是扫描式的,而读写数据时的通信却是过程的需要一定时间来等待的,所以读写的函数不是独立的,它需要一个专门的服务程序来反馈执行的结果。同时需要注意的是,读写操作在某一时刻只允许一个执行(最好读写操作之间留一定时间间隔)。WWW.PLCJS.COM——可编程控制器技术门户
此外,西门子提供的Modbus RTU Slave程序不支持广播命令。P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
I、地址定义W1WW_P4LCJS_COM-PLC-技.术_网
1、 V变量区的占用WWW_P※LCJS_CO※M-PLC-技-.术_网
一共需要V变量区786个字节。在程序设计时,用户程序不要占用该内存区。WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
WWW_PLC※JS_COM-PmLC-技.术_网
特别注意:V变量区的占用地址是相对的,通过修改库内存地址,可以改变使用V变量区的范围。P.L.C.技.术.网——可编程控制器技术门户
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
WWcW_PLCJS_COM-PLC-技.术_网
P.L.C.技.术.网——可编程控制器技术门户
plcjs.技.术_网
2、 定时器的占用WWW_PLC※JS_COM-PmLC-技.术_网
占用了定时器T100,用户程序不要再使用T100了。WWW_PLCJS@_COM%-PLC-技.术_网
变量名 说明 备注WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
T100 10ms定时器 WWW.PLCJS.COM——可编程控制器技术门户
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
II、接口函数说明WW.W_PLCJS_COM-PLC-技.术_网
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
1、YFMBUS_INITWWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
a. 名称:YFMBUS_INIT ——可——编——程——控-制-器-技——术——门——户
b. 类型:WWW_P※LCJS_CO※M-PLC-技-.术_网
c. 功能:Modbus RTU Client初始化——可——编——程——控-制-器-技——术——门——户
d. 参数:WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
WWcW_PLCJS_COM-PLC-技.术_网
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
2、YFMBUS_ ServerWWW.PLCJS.COM——可编程控制器技术门户