请高手看看S7200自由口通讯程序,有问题
¬上位PC通过自由口通讯协议,给PLC一个模拟量值控制PLC模拟量输出模块从而控制电动机转速
PLC程序部分
主程序
Network 1
LD SM0.7//第一次扫描调用初始化子程序
EU
O SM0.1
CALL SBR_0
Network 2
AB= VB302, 5 //指令类型为读指令
A M0.0 //BCC码校验正确
CALL SBR1 //调用读子程序
Network 3
AB= VB302, 6 //指令类型为写指令
A M0.0 //且BCC码校验正确
CALL SBR_2 //调用写子程序
Network 4
LD M0.1 //指令接收完成后调用BCC码校验子程序
CALL SBR_3
Network 5
LD SM4.5 //当端口空闲时启动RCV
RCV VB300, 0
Network 6
LD SM0.7
ED
CALL SBR_4
TITLE=子程序注释SBR_0
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 35, SMB94
ATCH INT0, 23 //连接口0接收完成的中断
ATCH INT1, 9 //连接口0发送完成的中断
ENI //中断允许
RCV VB300, 0
Network 3
LD SM0.0
MOVD &VB302, VD349 //装入地址指针
MOVB 0, VB379 //BCC码寄存器清零
MOVD &VB356, VD381 //装入地址指针
MOVB 0, VB380 //BCC码寄存器清零
TITLE=子程序注释SBR_1
Network 1 // 网络标题
// 网络注释
LD SM0.0 //停止端口0的接收
R SM87.7, 1
R M0.0, 1
RCV VB300, 0
Network 2
LD SM0.0 //将数据写入发送缓冲区
MOVB 103, VB354
MOVB 1, VB355
HTA *VD335, VB356, 16
MOVB 47, VB374
MOVB 21, VB353
Network 3
LD SM0.0 //计算BCC校验码
FOR VW377, +1, +16
Network 4
LD SM0.0
XORB *VD381, VB380
Network 5
LD SM0.0
INCD VD381
Network 6
NEXT
Network 7
LD SM0.0
HTA VB380, VB372, 2 //BCC校验码写入发送缓冲区
Network 8
LD SM4.5 //发送反馈信息
XMT VB353, 0
TITLE=子程序注释SBR_2
Network 1 // 网络标题
// 网络注释
LD SM0.0 //停止端口0的接收
R SM87.7, 1
R M0.0, 1
RCV VB300, 0
Network 2
LD SM0.0 //装入要写如数据源的地址指针
MOVD &VB315, VD345
Network 3
LD SM0.0 //写入数据
ATH *VD345, *VD335, VB339
Network 4
LD SM0.0 //指令执行的反馈信息写入发送缓冲区
MOVB 21, VB353
MOVB 103, VB354
MOVB 2, VB355
MOVB 47, VB374
Network 5
LD SM4.5 //发送指令执行的反馈信息
XMT VB353, 0
TITLE=子程序注释SBR_3
Network 1 // 网络标题
// 网络注释
LD SM0.0
R M0.1, 1 //复位verify子程序的执行条件
Network 2
LD SM0.0 //计算BCC码
FOR VW375, +1, +29
Network 3
LD SM0.0
XORB *VD349, VB379
Network 4
LD SM0.0
INCD VD349
Network 5
NEXT
Network 6
LDB= VB379, VB340 //当BCC码校验正确时,M0.0置1
AB= VB333, 71
S M0.0, 1
Network 7
LDB= VB333, 71 //BCC码错误时发送反馈信息
AB<> VB379, VB340
MOVB 21, VB353
MOVB 103, VB354
MOVB 3, VB355
MOVB 47, VB374
R SM87.7, 1
RCV VB300, 0
XMT VB353, 0
Network 8
LDB<> VB333, 71 //指令格式错误或RCV超时时发送反馈信息
MOVB 21, VB353
MOVB 103, VB354
MOVB 4, VB355
MOVB 47, VB374
R SM87.7, 1
RCV VB300, 0
XMT VB353, 0
TITLE=子程序注释SBR_4
Network 1 // 网络标题
// 网络注释
LD SM0.0
MOVB 16#08, SMB30//设置断口0为普通PPI通讯口
Network 2 //对转速进行赋值
LD SM0.0
MOVW +0, VW100 //将主机计划转速置0
MOVD +3200, VD110 //将3200放入VD110
MOVD +6400, VD114
MOVD +9600, VD118
MOVD +12800, VD122
MOVD +16000, VD126
MOVD +19200, VD130
MOVD +22400, VD134
MOVD +25600, VD138
MOVD +28800, VD142
MOVD +32000, VD146
Network 3
LD SM0.0
MOVD &VB0, VD10 //得到VB0的地址
MOVD &VB2, VD14 //得到VB2的地址
MOVB VB302, VB5
BTI VB5, VW5 //将字节转化为整数
ITD VW5, VD5 //将整数转化为双整数
+D VD5, VD10 //计算PLC中的实际地址
ATH VB303, *VD10, 2
MOVW *VD10, VW100
Network 4
LD SM0.0
MOVD &VB106, LD10
ITD VW100, VD102
*D +4, VD102
+D VD102, LD10
MOVD *LD10, VD96
DTI VD96, LW14
MOVW LW14, AQW0
TITLE=中断程序注释INT_0
Network 1 // 网络标题
// 网络注释
LD SM0.0
ATH VB303, VB334, 2 //指令译码(ASCII码到十六进制)
ATH VB305, VB335, 8
ATH VB313, VB339, 2
ATH VB331, VB340, 2
S M0.1, 1 //置位Verify子程序的触发条件
MOVB 0, VB379 //BCC码寄存器清零
MOVD &VB302, VD349 //装入地址指针
TITLE=中断程序注释INT_1
Network 1 // 网络标题
// 网络注释
LD SM0.0
R M0.0, 1 //复位BCC校验码正确的标志位
S SM87.7, 1 //允许口0进行接收
MOVB 0, VB379 //BCC校验码寄存器清零
MOVB 0, VB380 //BCC校验码寄存器清零
MOVD &VB302, VD349 //重新装入地址指针
MOVD &VB356, VD381
MOVB 0, VB333 //接收缓冲区中存放指令结束字符的字节清零¬¬¬¬¬¬¬¬¬¬¬¬