| 作者 | 主题 |
|---|---|
|
jacky_j 新手 经验值:19 发帖数:7 精华帖:0 |
楼主
主题:自由口通讯编程
请高手看看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 //接收缓冲区中存放指令结束字符的字节清零¬¬¬¬¬¬¬¬¬¬¬¬ |
|
H.L 侠圣 经验值:2881 发帖数:1766 精华帖:9 |
楼
主题:回复:自由口通讯编程
可能大伙都感觉通讯程序不太好调试,因为看不见、摸不着,所以不好监视,我做过很多个自由口通讯的程序了,我感觉只要方法得当,这个并不难:
1、严格按照通讯接口的定义来连接通讯线路,这和必须按照电路原理图来接线是一个道理。 2、正确定义双方的波特率、数据位、校验位、停止位信息,需要设置站地址信息的要设置好地址信息。 3、充分理解通讯协议的内容,每个字符或信息所代表的含义,数据的格式,起始字符、整条消息的长度、结束字符等。 4、虽然完成一次收/发很快,但在我们的脑子里要能像电影里那样回放慢镜头,能将其分解你才能知道你成功到哪一步了。 5、调试时不防先单步调试,比如先测试单条命令的发送,再测试单条命令的接受,再测试收/发,看双方应答是否正确。 6、通讯整体虽然是由一条条命令来组成,但我们在完成整个通讯任务时,最好有个整体框架,这样你的逻辑关系才会清晰,才能控制好何时发送某条指令,何时接收某条指令,何时校验、转换数据格式、保存数据、或置标志位、发生错误时重新发送或丢弃该信息等。 7、尽管如此,有个调试助手还是能够事半功倍的,比如拿VB做个监视画面,一个发送窗口,一个接收窗口,再来个发送按钮,接收设成自动的,调去吧,方便多了。 8、如果两头都能监视那是最好的了,PLC若是只有一个通讯口,不防先借用Q点做些标志位,通过这些标志位也能够判断出程序到哪个地方不对了。 |