找答案的高端用户(找答案钻石及双钻级别的用户)将尽可能从此问题下的所有回
答中,为您推荐最佳答案。届时您可以根据推荐数采纳答案。
如果自提问时间起7天内您仍无法选出最佳答案,您可以选择“无满意答案”关闭此问题。
{{itemCategory}}
手机扫码追踪该问题,
觉得实用,立即去分享!
点击复制链接
使用CP341用于ModBus通讯,可以对多ModBus从站轮询读取数据,并可以对每个从站的布尔量和寄存器量轮询读取:
这里使用三个代码来举例:
L MW 6 //设置你每个通讯全局的巡检次数
JL LSTX
JU SEG1
JU SEG2
JU SEG3
LSTX: JU COMM
SEG1: L 6
T "SOURCE_DB".DATA_ADDR
L 32
T "SOURCE_DB".DATA_LENGTH
L 2 //FC2
T "SOURCE_DB".function_code //fuction code is 2 Read Input Status
L MB 5
T "SOURCE_DB".slave_address //Destination DB NO. is MB5,just as slaves NO.
L 0
T MW 8 //DBB_NO. the received blocks start address
JU COMM //added JU COMM
SEG2: L 38
T "SOURCE_DB".DATA_ADDR
L 32
T "SOURCE_DB".DATA_LENGTH
L 1 //FC1
T "SOURCE_DB".function_code
L MB 5
T "SOURCE_DB".slave_address
L 4 //4,5,6,7
T MW 8
JU COMM //added JU COMM
SEG3: L 58
T "SOURCE_DB".DATA_ADDR
L 24
T "SOURCE_DB".DATA_LENGTH
L 4 //FC4
T "SOURCE_DB".function_code
L MB 5
T "SOURCE_DB".slave_address
L 68 //68--114
T MW 8
COMM: UC "Execute Send Jobs"
UC "Execute Receive Jobs"
这个例子中需要几个从站轮询读取数据的。从站号在MB5中。
然后你在另外的块中对MB5进行从1--n的巡检。如果你的从站只有一个,那么直接写入具体数据即可。
MW6也需在每次收发结束后处理下,以便各个FC能够循环执行:
L MW 6
L 3
<I
JC tom
L 0
T MW 6
tom: NOP 0
然后需要注意的是:接收FB的
DB_NO :=MW4
DBB_NO :=MW8
CALL "P_RCV_RK" , "IDB_P_RCV_RK"
EN_R :=DB41.DBX0.0
R :=
LADDR :=DB41.DBW16
DB_NO :=MW4
DBB_NO :=MW8
L_TYP :=
L_NO :=
L_OFFSET:=
L_CF_BYT:=
L_CF_BIT:=
NDR :=DB41.DBX0.4
ERROR :=DB41.DBX0.5
LEN :=DB41.DBW10
STATUS :=DB41.DBW12
关于WinCC读取DB,你先建立外部通讯变量。
二进制,十六位数值等,
然后在选择DB的相关bit,或者B,DWD等。注意一定要使得数据类型一致!
还要注意的一点就是:你如果要在WinCC中显示你从ModBus读取的数据,你可注意读上的字是前后字节相反的!你需要在程序中做相应处理。
相关东西太多,要讲清楚还是比较困难,如有疑问,发邮件给我。
首次回答问题,获得
双倍西币积分!
立即成为技术知识分享的一员!
欢迎您访问支持中心!
丰富的视频,全方位的文档,大量的网友交流精华……
为了更好的完善这些内容,我们诚邀您在浏览结束后,花20秒左右的时间,完成一个用户在线调查!
感谢您的支持!