技术论坛

 回复:自由口通讯编程

返回主题列表
作者 主题
jacky_j
新手

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

您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。