技术论坛

 回复:应用探讨——S7-300/400 PLC Modbus通讯应用探讨

返回主题列表
作者 主题

总坛主
西门子官方工程师西门子官方工程师

经验值:23725
发帖数:3679
精华帖:8
楼主    2011-07-18 14:59:27
主题:应用探讨——S7-300/400 PLC Modbus通讯应用探讨
Modbus 作为一种容易使用的通信方式, 在各种应用场合得到了广泛的使用。通过Modbus协议我们可以使西门子的PLC与各种类型的仪表以及不同厂家的设备相联系在一起。西门子的s7-300/400 的modbus 模块 的使用,使西门子的PLC有了更广泛的使用,并且在网络上的使用更方便,更通用。
下载中心参考文档:
25380100:CP 341 Modbus ASCII (16位和32位)从站可装载驱动(英文)
25362836 :CP 341 Modbus ASCII (16位和32位)主站可装载驱动(英文)
1220184 :S7 串行通信模板 Modbus RTU 主站可装载驱动(EN)
1218007:S7 串行通信模板 Modbus RTU 从站可装载驱动(EN)
1117397:CP 341 串行通信模块的安装和参数配置(EN)
27774276:可装载的驱动程序 Modbus Slave (RTU)
27774018:可装载的驱动程序“Modbus Master (RTU)”
25356060:CP441-2/341的 Modbus ASCII 16 位和 32 位可加载的驱动程序
26702609:Modbus 协议的属性,优点及特点?
A0081:CP340/CP341/CP440/CP441通讯及编程
A0336:CP341 Modbus RTU多站点轮询
A0311:PAC3200 MODBUS RTU通信使用入门
A0384:S7-300 CP341作主S7-200作从的Modbus通信

活动奖励:
此次集中交流将持续至8月10日,其中所有精华帖作者将获得加倍精华奖励积分;最终所有有效留帖的网友将获得加倍发帖积分。更多积分带给您更多奖品兑换的自由。
对于有突出发言贡献的网友,还可以在当前的可兑换奖品中免费挑选任一款奖品。
交流结束后也将专门整理重要内容,供广大网友分享参考。
预祝大家交流愉快,收获丰富!
www123456
至圣

经验值:12603
发帖数:2379
精华帖:86
1楼    2011-07-20 09:30:26
精华帖  主题:回复:应用探讨——S7-300/400 PLC Modbus通讯应用探讨
Modbus RTU是基于串口的一种通信协议,协议开放,多用于连接现场仪表设备,通信距离与串行通信定义相同。由于报文简单、开发成本比较低,许多现场仪表仍然使用Modbus RTU协议通信。Modbus RTU格式通信协议以主从的方式进行数据传输,主站发送数据请求报文到从站,从站返回相应报文。
CP341发送模块的发送程序主要是通过调用功能块FB8来实现,FB8是基于上升沿触发工作的.来一个上升沿FB8工作一次向总线上发送一个请求数据包,所以在程序中一定要设计一个触发代码段,来不断的使REQ:=M50.0循环往复的置“1”置“0”,这样FB8就可以正常运行了。
在设计程序时一定要注意FB8的参数SF:=‘S’及R_TYP:=‘X’的值都是大写否则程序调试不成功。FB8需要一个背景数据块.这一背景数据块一般由系统自动生成.以上程序中为DB3;对于通过CP34 1的Modbus Master驱动通讯的发送模块需要设计发送数据块DB块.用来对主站发送参数进行设置和初始化。
接收程序是调用FB7来实现的,由于CP341可以处理接收程序的细节部分.因此对于设计者来说只需要进行简单的设计就可以实现数据的接收。
对于Modbus多从站的通信(CP341带硬件狗为主站),编程时尤为需要注意,对于地址和站号等的轮询需要合理安排,否则会引起从站间的数据混乱。同时注意读上来的高低字节问题。
管理员注:本帖已被纳入此次探讨发帖整理,请点此详阅
依然
至圣

经验值:10152
发帖数:2530
精华帖:19
6楼    2011-07-24 15:10:40
精华帖  主题:回复:应用探讨——S7-300/400 PLC Modbus通讯应用探讨
Modbus通讯比较普遍,尤其在仪表方面,但是如果实时性要求比较高、从站比较多,还是存在一定的问题。
我们应用的从站不是很多,一般小于10个,都是CP341+Dongle的模式。
现场感觉主要就是通讯速度和从站故障处理的问题:
1,从站数据需要参与控制,且实时性要求比较高,有状况后,45s内需要处理别的机器且保障已经正常运行;Modbus的通讯速度一边都是支持到115200或者38400,并不是很快,一旦从站过多,轮询起来会比较慢;
2,从站掉电或者故障后,导致的通讯堵塞,如果没有特殊处理,每次轮询到故障从站都会使通讯特别慢;程序可以判断处理,但是故障后多久重新判断,故障后数据的复位等还是比较麻烦,我曾经尝试通讯后把该从站数据清除,结果跑偏,把正常的从站数据也清了,原因是通讯堵塞,接下来的从站也受到了影响,至今还没有好的解决方案;
3,bool和register的通讯字长,手册说bool一次1024个,register一次127个;但是我尝试过register一次125个words,通讯总是超时,后来现场原因,没时间再试,还是改回原来的32words。
欢迎大侠们拍砖。
管理员注:本帖已被纳入此次探讨发帖整理,请点此详阅
JUST DO IT
苦斗
侠士

经验值:1089
发帖数:299
精华帖:3
20楼    2011-07-31 12:49:46
精华帖  主题:回复:应用探讨——S7-300/400 PLC Modbus通讯应用探讨
我也一直用CP340实现Modbus RTU通讯方式实现读写操作!CP341没有用过!
Modbus RTU通讯就是普通的串行通讯而已(一发送、一接收如此循环),只是按照他们自己通讯规约!
如: 地址、功能码、数据域、CRC校验码等(发送和返回的读写长度可能不同,根据情况而定)
目前的变频器、智能仪表等都支持Modbus RTU! 也是最常见的从站!
具体协议请查询Modbus通讯协议!
根据我做过的和三垦、ABB变频器、托利多称重仪表等通讯来说明一些常见的功能码如03读、06写、10(H)

批次写功能!
配置:cpu312+CP340、ABB_510变频器 实现读电流、频率、写频率.
大致思路:PLC里做过从站轮询,功能(读电流、读频率、写频率)轮询!
CP340参数配置:
硬件组态里面:地址默认即可(比如320);
基本参数栏:中断生成:否,参数---Protocol选:ASCII,双击Protocol----Speed选择9600(最高只能9600,这点

不同于200PLC) 数据位8位,停止位1位,无奇偶校验
在Interface栏下 选择Half Duplex (RS 485) TWO-Wire Mo
其它都默认即可!
下面开始就03读频率(104,根据寄存器地址起始对应67H)命令
如轮询地址1,功能地址是1
发送命令:
地址 功能码 数据域读起始高位 数据域读起始低位 被读数据个数高位 被度数据个数低位 CRC_l CRC_H
01H 03H 00 67H 00 01 ... ...
返回格式
地址 功能码 数据域个数高位 数据域个数低位 数据域高位 数据域低位 CRC_L CRC_H
01 03 00 01 ### ### ... ...

06H和10H类似

可以用串口通讯软件测试下 发送一命令 看看返回数据是否正确

所以问题关键是弄清楚协议、轮询程序、以及CRC校验等
关于CRC校验,建议不要开数学公式 网上有关于计算的步骤:
具体如下:
1- 预置16位寄存器为十六进制FFFF(即全为1)。称此寄存器为CRC寄存器;
2- 把第一个8位数据与16位CRC寄存器的低位相异或,把结果放于CRC寄存器;
3- 把寄存器的内容右移一位(朝低位),用0填补最高位,检查最低位;
4- 如果最低位为0:重复第3步(再次移位); 如果最低位为1:CRC寄存器与多项式A001(1010 0000

0000 0001)进行异或;
5- 重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;
6- 重复步骤2到步骤5,进行下一个8位数据的处理;
最后得到的CRC寄存器即为CRC码。

最好做过个子程序 在发送命令和接收命令中调用即可
下面是我的校验子部分程序 仅供参考
L W#16#FFFF
T #TEMP2
L #Start_add
SLD 3
LAR1
L #DBNO
T #TEMP4
OPN DB [#TEMP4]
NOP 0
L #Count
x001: T #TEMP3
L B#16#0
T #TEMP5
NOP 0
L DBB [AR1,P#0.0]
T LB 9
L #TEMP5
L #TEMP2
XOW
T #TEMP2
+AR1 P#1.0
L 0
T #TEMP6
NOP 0

L 8
x002: T #TEMP6

L #TEMP2
SRW 1
T #TEMP2
JP x003
JU x004
x003: NOP 0
A(
L W#16#A001
L #TEMP2
XOW
T #TEMP2
)

x004: NOP 0
L #TEMP6
LOOP x002
NOP 0
L #TEMP3
LOOP x001
NOP 0
L LB 2
T #CRC_H
L LB 3
T #CRC_L
另外我发现同样是Mobus通讯 200通讯间隔最短可以调到50ms发送 接收一次,同样的配置用CP340最短
要80MS才来得及接收!
是什么原因呢?
难道200利用的是中断 340用的是程序 所以速度没中断快??
管理员注:本帖已被纳入此次探讨发帖整理,请点此详阅
一天到晚游泳的猪
侠圣

经验值:2643
发帖数:768
精华帖:10
21楼    2011-08-02 14:35:38
精华帖  主题:回复:应用探讨——S7-300/400 PLC Modbus通讯应用探讨
说说我的modbus调试经历
第一次是用cp441-2(在400h上,配两块,带硬件dongle)做冗余的slave与一个rtu(两个串口)通讯,西门子的modbus slave做从站还是比较简单的,配下就行不用编程。不过现在想想这种方案太奢侈了,应该在400h挂的et200上面配两块cp341
第二次是用cp341(不带硬件狗)以modbus ascii协议与仪表通讯,配成了ascii驱动自己写LRC校验啥的
第三次,用cp341实现modbus rtu的主站通讯,一块cp341带了硬件狗,另外一块没带(因为从站的通讯要求有点怪,配成ascii驱动比较符合要求,然后自己写crc校验等等),通讯对象是空压机,能发控制命令

感觉调试modbus最好要掌握modbus的通讯原理,尤其是能看懂报文内容,这样就可以用串口调试软件分析故障原因

另外,西门子plc实现modbus通讯并不是仅仅用cp340、341或者cp441-2,还可以用其他方法:

1、et200s带的串行模块,master/slave可以灵活配置
2、用dp/modbus网关,要求plc有dp接口,不过这种网关一般会有点限制,比如报文的数量、长度等等
管理员注:本帖已被纳入此次探讨发帖整理,请点此详阅
有生之年,狭路相逢,终不能幸免
火麒麟
侠圣

经验值:4024
发帖数:571
精华帖:18
22楼    2011-08-04 08:45:54
精华帖  主题:回复:应用探讨——S7-300/400 PLC Modbus通讯应用探讨
上面一位老兄的CRC校验程序可以考虑用下循环,少用跳转:
VAR_INPUT
DB_NO : INT ;
DBB_Start : INT ;
DBB_Counts : INT ;
END_VAR
VAR_OUTPUT
CRC_H : BYTE ;
CRC_L : BYTE ;
END_VAR
VAR_TEMP
CRC_REG : WORD ;
DB_NO_TEMP : INT ;
BytesChecked : INT ;
BitsChecked : INT ;
END_VAR
BEGIN
NETWORK
TITLE =

L W#16#FFFF;
T #CRC_REG; //预置CRC寄存器
L #DB_NO;
T #DB_NO_TEMP;
OPN DB [#DB_NO_TEMP];
L #DBB_Start; //读入校验起始字节
SLD 3;
LAR1 ;

L #DBB_Counts; //读入校验字节数量
_A: T #BytesChecked; //字节处理循环
L DBB [AR1,P#0.0];
L LB 1;
XOW ;
T LB 1;

L 8;
_B: T #BitsChecked; //位处理循环
L #CRC_REG;
SRW 1;
T #CRC_REG;
JZ _C; //检验移出位是否为1
L #CRC_REG;
L W#16#A001;
XOW ;
T #CRC_REG;

_C: L #BitsChecked; //校验下个位
LOOP _B;

+AR1 P#1.0; //校验下个字节
L #BytesChecked;
LOOP _A;

L LB 1; //输出校验码
T #CRC_H;
L LB 0;
T #CRC_L;
END_FUNCTION
管理员注:本帖已被纳入此次探讨发帖整理,请点此详阅
业精于勤,行成于思
依然
至圣

经验值:10152
发帖数:2530
精华帖:19
24楼    2011-08-11 08:12:22
精华帖  主题:回复:应用探讨——S7-300/400 PLC Modbus通讯应用探讨
版主你好,清除该站的数据是因为工艺需要,如果不清除,有可能该站掉线后上位还有数据显示,会给操作人员错误的判断信息,最主要的是:我的站信息里面需要参与判断控制的。
我的程序是每个从站一个接受DB,清除也是用SFC21,就是清除的时候是根据判断当前的站号,,当有通讯超时时,把当前的站号对应的站数据清零。
具体程序如下:
发送超时:
O "SendOK"
O "SendErr"
O "SendOverTime"
R "SendReq"
S "Recving"
//发送数据超时检测
A "SendReq"
L S5T#100MS
SD "SendOverTime"
接受超时:
O "RecvOk"
O "RecvErr"
O "RecvOverTime"
JCN _199
//接收完成
R "Recving"
CALL "Comm_Complete"
_199: NOP 0

A "Recving"
L S5T#400MS
SD "RecvOverTime"
当发现发送或者接收延时定时器激活时,调用SFC21,清除当前的接收从站对应的DB号数据。
我可以肯定是这里出错了,但是这样有时还会清掉通讯正常的数据,由于现场原因,故障这块一直没有时间处理,但是问题却一直存在,如鲠在喉。
管理员注:本帖已被纳入此次探讨发帖整理,请点此详阅
JUST DO IT
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。