请教各位老师,我测试了一个自由口发送I/O状态的程序,但遇到个问题,我无法用MOVB 'F', VB60写一个字符到一个字节中,编译成功的,但下载到PLC中就跳ERROR了。请问各位老师该怎么处理?
PS:小程序在下面,主要想实现把I/O口用16进制字符串形式通过自由口发送到上位机,但基础较差,不会将一个字节内数据转成字符串,只好用笨办法读表,各位老师有什么好方法吗?还请不吝指导,分比较少,先谢谢了。
主程序:
LD SM0.1
CALL Initialize:SBR0
Initialize:SBR0程序:
LD SM0.0
MOVB 16#09, SMB30
MOVB 100, SMB34
ATCH INT_0:INT0, 10
ENI
IO_CONVERT:SBR1程序:
//I/O状态映射表
LD SM0.0
LPS
AB= VB50, 16#0F
MOVB 'F', VB60
LRD
AB= VB50, 16#0E
MOVB 'E', VB60
LRD
AB= VB50, 16#0D
MOVB 'D', VB60
LRD
AB= VB50, 16#0C
MOVB 'C', VB60
LRD
AB= VB50, 16#0B
MOVB 'B', VB60
LRD
AB= VB50, 16#0A
MOVB 'A', VB60
LRD
AB= VB50, 16#09
MOVB '9', VB60
LRD
AB= VB50, 16#08
MOVB '8', VB60
LRD
AB= VB50, 16#07
MOVB '7', VB60
LRD
AB= VB50, 16#06
MOVB '6', VB60
LRD
AB= VB50, 16#05
MOVB '5', VB60
LRD
AB= VB50, 16#04
MOVB '4', VB60
LRD
AB= VB50, 16#03
MOVB '3', VB60
LRD
AB= VB50, 16#02
MOVB '2', VB60
LRD
AB= VB50, 16#1
MOVB '1', VB60
LPP
AB= VB50, 16#0
MOVB '0', VB60
//INT0中断程序
TITLE=INT0中断程序
Network 1
// 将IB0低四位取反再取出,存于vb20按照格式0000XXXX
LD SM0.0
MOVB IB0, VB10
AENO
INVB VB10
AENO
MOVB VB10, VB20
ANDB 2#1111, VB20
Network 2
// 将IB0高四位取反再取出,存于vb25按照格式0000XXXX
LD SM0.0
MOVB VB10, VB24
AENO
ANDB 2#11110000, VB24
AENO
MOVB VB24, VB25
SRB VB25, 4
Network 3
// 将IB1低四位取反再取出,存于vb30按照格式0000XXXX
LD SM0.0
MOVB IB1, VB11
AENO
INVB VB11
AENO
MOVB VB11, VB30
ANDB 2#1111, VB30
Network 4
// 将IB1高四位取反再取出,存于vb35按照格式0000XXXX
LD SM0.0
MOVB VB11, VB34
AENO
ANDB 2#11110000, VB34
AENO
MOVB VB34, VB35
SRB VB35, 4
Network 5
// 将vb0低4位转化成字符串,VB50为参数入口,vb60为结果出口,下同
LD SM0.0
LPS
MOVB VB20, VB50
AENO
CALL SBR1
LPP
MOVB VB60, VB105
Network 6
// 将vb0高4位转化成字符串
LD SM0.0
LPS
MOVB VB25, VB50
AENO
CALL SBR1
LPP
MOVB VB60, VB104
Network 7
// 将vb1低4位转化成字符串
LD SM0.0
LPS
MOVB VB30, VB50
AENO
CALL SBR1
LPP
MOVB VB60, VB103
Network 8
// 将vb1高4位转化成字符串
LD SM0.0
LPS
MOVB VB35, VB50
AENO
CALL SBR1
LPP
MOVB VB60, VB102
Network 9
LD SM0.0
MOVB '>', VB101
MOVB '@', VB106
Network 10 // 网络标题
// 将16通道I/O口接通情况发送至自由口,协议为:<+16位通道I/O状态+@
LD SM0.0
MOVB 6, VB100
XMT VB100, 0
问题补充:
WWCWWC:你好,感谢回答。我只用到自由口定时发送数据,上位机只接收。还需要通过SMB86/SMB88/SMB89设定协议的起始符和结束符吗?我在中断程序中设定的协议起始符和结束符是上位机做判断一串数据用的。
您能否留个邮箱或者发封邮件给我,我想关于这个问题详细问问,这里回复不了,交流不友好,我邮箱是:baobao13579190@sina.com
谢谢!
最佳答案
没有plc无法测试,只能凭自己以前做过的认识。
字符写入到VB区是没有问题的,只能总感觉你调用定时中断SMB34内容太多;你定义了起始、结束符标记,但没有定义标记值,即SMB86/SMB88/SMB89,这些定义在初始化子程序(SBR_0)中定义,而不是在中断程序的网络9定义的。
补充问题回复:
要的,这个是通讯的规约。用户只能选择起始、结束符;空闲线时间或者两者的结合。
提问者对于答案的评价:
老师,我单独试通讯是成功的(就是把I/O_CONVERT程序屏蔽)PLC也亮绿灯,单独新建一个程序就测试这个语句不涉及通讯就不行,PLC亮红灯,请问是语句格式错了还是什么问题?
LD SM0.0
MOVB ''F'', VB60
您能给我发个邮件吗?我想向您详细问下感谢!我邮箱是:baobao13579190@sina.com
最佳答案作者回复:
写入字符是用单引号,如‘F’,这个你应该注意。另外你采用16#制数传送试试。
LD SM0.0
MOVB 16#0F,VB60
原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc180430.html