西门子邢台模块代理商
由于本工程使用的是pc/ppi电缆,要在plc的程序中考虑电缆的切换时间。plc接收到请求报文到它返回发送缓冲区的数据的延迟时间必须不小于电缆的切换时间。波特率为9600bps时,电缆的切换时间是2ms。在本工程的程序中是用定时中断实现切换延时的。
定时中断子程序:
network title ’定时中断程序int_2
ld sm0.0
dtch 10
xmt vb200, 0
当程序运行到“启动定时中断"(即atch int_2,10)的语句时,就会跳到如上所示的中断子程序中,sm0.0是特殊存储器,该位始终为1,即只要plc处于run状态,这一开关即是接通的。xmtvb200,0语句是用来发送数据到串口的,此时发送的是存储在以vb200为首地址的连续的存储空间中的数据,是通过端口0发送的。
为了提高通信的可靠性,我们需要使用到异或校验,即在通信的双方都将每一帧的每一个字符作异或校验,将两者进行对比,如果不相同则可以判定通信有误。
network1 network title ’求异或校验码的子程序fcs
ld sm0.0
movb 0, #xorc
bti #numb, #numi
for #temp1, +1, #numi
movb 0, #xorc ’用来把异或校验码
清零, 用bti#numb,
#numi将字节数
转换为整数
network2
ld sm0.0
xorb *#pnt, #xorc
incd #pnt
network3
next
for到next语句指明了一个循环,从这一帧的第一个字符开始(不包括起始字符)到该帧中*后一个字符作异或运算。通过调用这个子程序可以计算所的数据存储空间内的字符的异或校验码,如果在上位机中的vb程序中也有计算校验码的子程序,那么就可以比较这两次计算的校验码是否相同。可以使用语句(callfcs, &vb102, vb99,vb90)来调用该子程序,其中&vb102是指出子程序fcs进行校验的起始地址,vb99是用来存储需要异或的字节数,而vb90是用来存储计算出来的校验和。假设把从上位机接收到的校验码存储在vb91中,比较vb90和vb91中的数据就可以检验这次通信是否正确。同样,我们可以使用这个子程序计算从plc中发送的数据的校验码,把它送到上位机中某一特定的地址中,在上位机中比较两个数据是否正确(在上位机的计算异或校验码的vb程序将在后面给出)。
因为报文的起始字符和结束字符只有8位,接收的报文数据区内出现与起始字符和结束字符相同的字符的几率很大,这就可能会是数据区字符与起始字符或结束字符发生混淆,为了避免这种情况,可以在发送数据前对数据作一下处理,把数据字符转换为bcd码,在s7-200中专门提供了整数与bcd码的转换指令,可以使用语句(ibcdvw200)就把输入的整数转换为bcd码,结果送入了vw200中。上位机接收到后需要将其转换回整数。
在初始化时要注意自由端口通信协议的设定,一定要使通信过程中的波特率,数据位,奇偶校验及停止位与上位机vb以及通信线上中设定的参数相同,否则将不能实现通信过程,要么接收不到数据,要么会出现“下标越界"的错误。
5上位机的通信部分采用vb语言编程
上位机通信接口部分采用vb语言来编写, 在vb中专门有一个控件microsoft commcontrol(简称mscomm控件)用来提供串行通信。在编程过程中只要设置mscomm控件的属性,就可以实现串行通信。mscomm控件一般不包括在常用的工具框中,需要在右边的工具框的空白处点击鼠标右键,选择components选项,就会出现components对话框,在其中的controls标签下就会找到microsoft comm control6.0,选定它, 点击确定就可以把这一控件加入到右边的工具框中, 图标为。