JZGKCHINA
工控技术分享平台
在工业自动化领域使用最多的免费通讯协议就是Modbus协议,而小型自动化领域西门子PLC也是占据了很大的份额。
硬件部分
如上图所示为西门子小型自动化产品 S7-200 SMART PLC,它支持Modbus RTU, Modbus TCP两种通讯协议。PLC本体自带1个以太网口和1个RS485串口,同时支持附加串口即RS485/RS232信号板。对于串口都支持主站和从站模式。
Modbus 是一种单主站的主/从通信模式。Modbus 网络上只能有一个主站存在,主站在 Modbus 网络上没有地址,从站的实际地址范围为 1 - 247。
Modbus 通信标准协议可以通过各种传输方式传播,如 RS232C、RS485、光纤、无线等。 在 S7-200 SMART CPU 通信口上实现的是 RS485 半双工通信,信号板可以实现RS485/RS232通讯。因RS485通讯距离远,抗干扰能力强,一般我们使用最多的就是它。
本体自带RS485接口(端口0)是9针 D 型连接器。端口定义如下图:
标准型CPU 还支持 SB CM01 信号板,该信号板可以通过 STEP 7-Micro/WIN SMART 软件组态为 RS485通信端口或 RS232 通信端口。下图为信号板的引脚分配 。
RS485 采用屏蔽双绞线,总线两端需要终端电阻。RS485 网络允许每一个网段的最大通信节点数为 32 个。目前他们支持的波特率为: 9.6K~187.5K,最大传输距离:50米。如果需要延长通讯距离可以使用RS485中继器,通讯距离可以延长到1000米以上,当然也可以使用光纤,无线通讯等延长通讯距离。
如下图可以通过中继器进行扩展,一个网络中最多可以使用 9 个西门子中继器。
西门子提供了两种类型的 RS485 网络连接器(如图 5. RS485网络连接器所示),可使用它们轻松地将多台通信节点连接到通信网络上。一种是标准型网络连接器,另一种则增加了可编程接口。下图中左图为标准型网络连接器,右图为带可编程接口网络连接器。
当然也可以使用价格较便宜的DB9接口连接器。如下图:
这些接头使用屏蔽双绞线连接PLC和从站设备。可以使用如下电缆:为西门子专用紫色电缆,也可以使用其他符合要求的屏蔽双绞线电缆。
注意:如果使用的西门子专用接头,不用关注引脚定义问题,只需要正确的将A/B线接到对应从站引脚上。
如果使用了廉价通讯接头,需要注意PLC接口的3和8引脚,焊接或者连接正确的线到从站设备上。
主站通讯程序编写
首先介绍一下Modbus的寻址,Modbus 地址为五到六位数,包含了数据类型和地址值。
Modbus 地址定义如下:
Modbus 地址和 S7-200 SMART 存储区地址的映射:
Modbus 保持寄存器地址:40001 中存储的数值为1234
S7-200 SMART 存储区字寻址 :VW100 中存储的数值为1234
S7-200 SMART 存储区字节寻址:VB100 中存储的数值为12, VB101中存储的数值为34
位地址(0xxxx 和 1xxxx)数据总是以字节为单位打包读写。第一个字节中的最低有效位对应 Modbus 地址的起始地址,如V1.7对应10008,V1.6对应10007,V1.5对应10006,V1.0对应10001.
首先,打开STEP 7-Micro/WIN SMART软件,在库指令中找到对应的主站编程的库指令,如下图:
调用 Modbus RTU 主站初始化程序:MBUS_CTRL
a. EN 使能位,必须保证每一扫描周期都被使能,一般使用SM0.0;
b. Mode 模式,为 1 时,使能 Modbus 协议功能;为 0 时恢复为系统 PPI 协议;
c. Baud 波特率,支持的通讯波特率为1200,2400,4800,9600,19200,38400,57600,115200,一般使用9600,传输距离较远时需要降低波特率以获得通讯稳定性;
d. Parity 校验方式,0=无校验,1=奇较验,2=偶较验;
e. Port 端口号,0 = CPU 集成的 RS 485 通讯口 ;1 = 可选 CM 01 信号板 ;
f. Timeout 超时时间,主站等待从站响应的时间,以毫秒为单位,典型的设置值为 1000 毫秒(1 秒),允许设置的范围为 1 - 32767;
g. Done 完成位,初始化完成,此位会自动置1。可以用该位启动 MBUS_MSG 读写操作(见例程);
h. Error 初始化错误代码(只有在 Done 位为1时有效),0= 无错误, 1= 校验选择非法, 2= 波特率选择非法, 3= 超时无效, 4= 模式选择非法, 9= 端口无效, 10= 信号板端口 1 缺失或未组态;
注意:Baud ,Parity,这两个参数的设置必须与从站保持一致。
调用 Modbus RTU 主站初始化程序:MBUS_CTRL
a. EN 使能位,同一时刻只能有一个读写功能使能;可以使用上一个 MBUS_MSG 指令的 Done 完成位来激活下一个 MBUS_MSG 的使能位,以保证所有读写指令循环进行。
b. First 读写请求位, 每一个新的读写请求必须使用脉冲触发;
c. Slave 从站地址,可选择的范围 1 - 247;
d. RW 读写请求:0 = 读, 1 = 写;
e. Addr 读写从站的数据地址;
f. Count 通讯的数据个数(位或字的个数)
g. DataPtr 数据指针:1. 如果是读指令,读回的数据放到这个数据区中; 2. 如果是写指令,要写出的数据放到这个数据区中;
h. Done 完成位
I. Error 错误代码:只有在 Done 位为1时,错误代码才有效; 0 = 无错误, 1 = 响应校验错误, 3 = 接收超时(从站无响应),4 = 请求参数错误(slave address, Modbus address, count, RW), 6 = Modbus正在忙于其它请求, 7 = 响应错误(响应不是请求的操作),8 = 响应CRC校验和错误;
在 CPU 的 V 数据区中为库指令分配存储区(Library Memory):
调用STEP 7 - Mciro/WIN SMART Instruction Library(指令库)需要分配库指令数据区(Library Memory)。库指令数据区是相应库的子程序和中断程序所要用到的变量存储空间.
操作步骤:
在指令树的Project(项目)中,以鼠标右键单击Program Block(程序块),在弹出的快捷菜单中选择Library Memory。在下图中使用建议地址。
如果不确定从站通讯是否完好,可以使用Modscan等软件进行从站通讯的测试。
具体通讯例程,不再详细介绍,需要特别注意的就是同一时刻不能有两条读写指令执行,当第一条 MBUS_MSG 指令完成后(Done位从 0 变为 1),清除第一条 MBUS_MSG指令的启用标志,然后设置第二条 MBUS_MSG指令的启用标志,按照这个逻辑进行循环读写。