PLC程序为:
主程序:
NETWORK 1
LD SM0.1 //第一次扫描调用初始化子程序
CALL initialize
NETWORK 2
LDB= VB134, VB199 //指令中的站地址与本机站地址相符
AB= VB102, 5 //指令类型为读指令
A M0.0 //BCC码校验正确
CALL Read //调用读子程序
NETWORK 3
LDB= VB134, VB199 //指令中的站地址与本机站地址相符
AB= VB102, 6 //指令类型为写指令
A M0.0 //BCC码校验正确
CALL Write //调用写子程序
NETWORK 4
LD M0.1 //指令接收完成后调用BCC码校验子程序
CALL Verify
NETWORK 5
LD SM4.5 //当端口空闲时启动RCV
RCV VB100, 0
Read子程序:
NETWORK 1
LD SM0.0 //停止端口0的接收
R SM87.7, 1
R M0.0, 1
RCV VB100, 0
NETWORK 2
LD SM0.0 //将数据写入发送缓冲区
MOVB 103, VB154
MOVB 1, VB155
HTA *VD135, VB156, 16
MOVB 26, VB174
MOVB 21, VB153
NETWORK 3
LD SM0.0 //计算BCC校验码
FOR VW177, +1, +16
NETWORK 4
LD SM0.0
XORB *VD181, VB180
NETWORK 5
LD SM0.0
INCD VD181
NETWORK 6
NEXT
NETWORK 7
LD SM0.0
HTA VB180, VB172, 2 //BCC校验码写入发送缓冲区
NETWORK 8
LD SM4.5 //发送反馈信息
XMT VB153, 0
Write子程序:
NETWORK 1
LD SM0.0 //停止端口0的接收
R SM87.7, 1
R M0.0, 1
RCV VB100, 0
NETWORK 2
LD SM0.0 //装入要写如数据源的地址指针
MOVD &VB115, VD145
NETWORK 3
LD SM0.0 //写入数据
ATH *VD145, *VD135, VB139
NETWORK 4
LD SM0.0 //指令执行的反馈信息写入发送缓冲区
MOVB 21, VB153
MOVB 103, VB154
MOVB 2, VB155
MOVB 26, VB174
NETWORK 5
LD SM4.5 //发送指令执行的反馈信息
XMT VB153, 0
Verify子程序:
NETWORK 1
LD SM0.0
R M0.1, 1 //复位verify子程序的执行条件
NETWORK 2
LD SM0.0 //计算BCC码
FOR VW175, +1, +29
NETWORK 3
LD SM0.0
XORB *VD149, VB179
NETWORK 4
LD SM0.0
INCD VD149
NETWORK 5
NEXT
NETWORK 6
LDB= VB179, VB140 //当BCC码校验正确时,M0.0置1
AB= VB133, 71
S M0.0, 1
NETWORK 7
LDB= VB133, 71 //BCC码错误时发送反馈信息
AB<> VB179, VB140
MOVB 21, VB153
MOVB 103, VB154
MOVB 3, VB155
MOVB 26, VB174
R SM87.7, 1
RCV VB100, 0
XMT VB153, 0
NETWORK 8
LDB<> VB133, 71 //指令格式错误或RCV超时时发送反馈信息
MOVB 21, VB153
MOVB 103, VB154
MOVB 4, VB155
MOVB 26, VB174
R SM87.7, 1
RCV VB100, 0
XMT VB153, 0
Initialize子程序:
NETWORK 1
LD SM0.0
MOVB 9, SMB30 //0口"9600,N,8,1"
NETWORK 2
LD SM0.0 //RCV指令初始化
MOVB 16#EC, SMB87
MOVB 103, SMB88
MOVB 71, SMB89
MOVB +1000, SMW92
MOVB 35, SMB94
R SM87.2, 1
NETWORK 3
LD SM0.0
ATCH RCVcomplete, 23 //连接口0接收完成的中断
NETWORK 4
LD SM0.0
ATCH XMTcomplete, 9 //连接口0发送完成的中断
NETWORK 5
LD SM0.0
ENI //中断允许
NETWORK 6
LD SM0.0
MOVB 2, VB199 //将本机站地址装入寄存器
NETWORK 7
LD SM0.0
MOVB &VB102, VD149 //装入地址指针
MOVB 0, VB179 //BCC码寄存器清零
MOVB &VB156, VD181 //装入地址指针
MOVB 0, VB180 //BCC码寄存器清零
RCVcomplete中断程序
NETWORK 1
LD SM0.0
ATH VB103, VB134, 2 //指令译码(ASCII码到十六进制)
ATH VB105, VB135, 8
ATH VB113, VB139, 2
ATH VB131, VB140, 2
S M0.1, 1 //置位Verify子程序的触发条件
MOVB 0, VB179 //BCC码寄存器清零
MOVD &VB102, VD149 //装入地址指针
XMTcomplete中断程序
NETWORK 1
LD SM0.0
R M0.0, 1 //复位BCC校验码正确的标志位
S SM87.7, 1 //允许口0进行接收
MOVB 0, VB179 //BCC校验码寄存器清零
MOVB 0, VB180 //BCC校验码寄存器清零
MOVD &VB102, VD149 //重新装入地址指针
MOVD &VB156, VD181
MOVB 0, VB133 //接收缓冲区中存放指令结束字符的字节清零
通过VB的MScomm控件对PLC进行读写,PC机得指令为33字节指令
程序如下 :
rivate Static Sub delays(sj) '定义 静态 延时过程(延时秒数)
Dim endtime As Long
Const dayscond = 24& * 60& * 60& '定义 数值常量 一天秒数
endtime = Timer + sj '结束时间 = 现在时间 + 延时秒数
If endtime > dayscond Then '当 结束时间 大于 一天秒数 则
endtime = endtime - dayscond '结束时间 等于 结束时间 减 一天秒数
Do While Timer > endtime '进入循环 条件 现在时间 大于 结束时间
Loop '结束循环
End If '结束判断
Do While Timer < endtime '进入循环 条件 现在时间 小于 结束时间
Loop '结束循环
End Sub
Private Sub Command1_Click()
plc_read
End Sub
Private Sub Form_Load()
MSComm1.CommPort = 3
MSComm1.Settings = "9600,n,8,1"
MSComm1.PortOpen = True
End Sub
Public Function plc_read()
Dim Cmdout(0 To 32) As Byte
Dim s1 As String
Dim cmd As String
Dim leth As Long
Dim strsend As String
Dim str5, str6 As String
strsend = "g5020800020008000000000000000013&"
MSComm1.Output = strsend
'MSComm1.Output =
delays 1
Text2.Text = Len(strsend)
instring$ = MSComm1.Input
Text1.Text = instring
end function
点击command1命令按钮读VB512开始的8个字节 结果PLC无返回信息
求高手指点原因