论文部分内容阅读
摘要:建立下位机PLC控制系统和基于C++ Builder设计的上位机监控系统之间的相互通信,在相互通信的过程中,PLC使用了自由口通信模式,而C++ Builder借助于第三方MSComm控件。在此基础上才能完成控制系统和监控系统的相关程序的编制和设置,为小型自控项目提供技术平台。
关键词:PLC;C++ Builder;自由口通讯
中图分类号: I253文献标识码: A
1.概述
对于多数的小型控制系统而言,在注重性能稳定和功能齐全的同时,投入成本也是必须考虑的因素之一。相对于市场上其他逻辑控制器,西门子S7-200 PLC性价比较高;而采用第三方软件(如VB或BCB等高级语言)编制的监控系统不仅灵活性好、系统投资低而且系统升级较为方便、适应范围更广。本设计在于完成基于西门子S7-200 PLC与第三方软件(C++ Builder)编制的监控系统间通讯从而为小型项目自控系统的设计打下基础。
2. PLC系统通讯程序设计
2.1自由口模式通信
自由口模式下程序可以通过接收中断、发送中断来完成发送和接收,也可以通过使用定时器实现定时执行发送指令和接收指令,从而完成数据交换和通讯。S7-200只有在RUN方式时自由口通信模式才被允许使用。
自由口通信指令包括自由口发送(XMT)指令和自由口接收(RCV)指令。发送指令(XMT),可以将数据缓冲区中的数据通过指令指定的通信端口发送出去,发送完成时将产生一个中断。接收指令(RCV),可以通过指令指定通信端口接收信息,并将其存储于接收缓冲区中。
用自由口通讯指令最多可以实现255个字符的数据交换,可以通过查询SM4.5和SM4.6的变化来判断是否发送完成。
数据缓冲区(TBL)操作数采用VB等;端口(PORT)为常数,其值的确定是依据所选用的CPU型号,TBL中数据存储格式如下:
表2.1 数据缓冲区格式
此外,完成自由口通信还必须对控制寄存器及特殊功能寄存器进行相关设置,设置格式如下:
表2.2 控制寄存器设置方式
表2.3 特殊功能寄存器功能表述
本设计采用PC/PPI电缆作为上位机和下位机的连接线,而PPI电缆的一端是RS485属于半双工通信方式,故接收和发送不可以同时进行,这里就涉及到一个接收指令和发送指令交替使用的问题。当PLC要发送数据时,必须保证接收使能位复位,而接收时还得需将接收使能位置位。关于使能位的置位和复位势必用到了接收信息控制字节即SMB87(SMB187),这也是在整个接收和发送过程中用的最频繁的控制字节。SMB87(SMB187)的位功能介绍如表2.4所示。对自由口端口初始化设置时,需分别为SMB30、SMB87、SMB94赋值16#09、16#B0和100。
表 2.4 接收信息控制字节的位功能
2.2 发送程序和接收程序的设计
在选择好自由口作为本次通信模式后,首先要进行协议的自定义,本设计中通信中采用的自定义协议如表2.5和表2.6所示。
表2.5 PLC向IPC发送数据格式
表2.6 PLC接收IPC数据格式
由于RS485的原因,接收和发送不能同时进行,所以要对接收和发送两个过程实现自动切换,使得接收和发送过程互不影响。本设计中采用定时器,是接收和发送子程序定时间隔执行。自由口通信下的接收程序在执行时必须保证接收使能位有效,即必须对SM87.7进行置位后,再执行RCV指令。
在使用XMT指令执行发送程序需要特别注意,在进行发送之前先必须将接收使能位(SM87.7)复位,同时再执行一次RCV指令,保证接收缓冲区的数据全部被读出,最后再执行XMT指令。
为了保证向上位机发送的数据准确可靠,PLC发送程序中加入发送数据的起始符和结束符号,以保证发送数据的准确,便于上位机采用查询方式接收数据。
3. 上位机通信程序设计
上位机程序中调用MSComm编写通信程序 ,波特率为9600bps、无校验、通信端口号为1,InputLen的值为1。
本系统在设计过程中为了迎合人们的习惯,决定采用十进制作为上位机数据输入格式,但是通信过程中数据以ASCII的形式参与各种运算,同时在PLC中实现ASCII转化功能最常用的指令是ATH,为了实现数据格式统一需要将待发送数据转化成十六进制的形式,相关函数为IntToHex()。
在MSComm控件下,为了保证数据的精确性,以免因数据传输问题而出错,采用将接收缓冲区中的数据以单字符形式接收,从接收到起始字符开始,一直到接收到结束字符为止的接收方式,接收程序段如下:
try
{ if(MSComm1->InBufferCount!=0)
{do
{tmp=AnsiString(WideString(MSComm1->Input));
X=X+1; //接收緩冲区加1
} while((tmp!="\x3E")&&(X<1024));// 数据起始字符为‘>’
X=0;//接收缓冲区清零
do
{tmp=AnsiString(WideString(MSComm1->Input));
temp=temp+tmp;//单字符拼装成字符串
X=X+1;//接收缓冲区加1
} while((tmp!="\x21")&&(X<1024));// 结束字符为‘!’
}
}
catch (...)
{ShowMessage("通信失败,请重试!");}// 通信异常时显示
for(int M=0;M<112;M++)
{ temp_int[M]=*(temp.c_str()+M);}// 将字符串拆分
for(int N=0;N<112;N++)
{ if(temp_int[N]==32)
temp_int[N]=0; // 遇到空格显示0
else if(temp_int[N]>=48)
temp_int[N]=temp_int[N]-48; //显示十进制数0~9
}
参考文献
[1]胡文金. 计算机测控应用技术[M].重庆:重庆大学出版社,2003.
[2]陈建明. 电气控制与PLC应用[M].第2版.北京:电子工业出版社,2007.
[3]陆卫忠. C++ Builder 6程序设计教程[M].北京:科技出版社,2005.
关键词:PLC;C++ Builder;自由口通讯
中图分类号: I253文献标识码: A
1.概述
对于多数的小型控制系统而言,在注重性能稳定和功能齐全的同时,投入成本也是必须考虑的因素之一。相对于市场上其他逻辑控制器,西门子S7-200 PLC性价比较高;而采用第三方软件(如VB或BCB等高级语言)编制的监控系统不仅灵活性好、系统投资低而且系统升级较为方便、适应范围更广。本设计在于完成基于西门子S7-200 PLC与第三方软件(C++ Builder)编制的监控系统间通讯从而为小型项目自控系统的设计打下基础。
2. PLC系统通讯程序设计
2.1自由口模式通信
自由口模式下程序可以通过接收中断、发送中断来完成发送和接收,也可以通过使用定时器实现定时执行发送指令和接收指令,从而完成数据交换和通讯。S7-200只有在RUN方式时自由口通信模式才被允许使用。
自由口通信指令包括自由口发送(XMT)指令和自由口接收(RCV)指令。发送指令(XMT),可以将数据缓冲区中的数据通过指令指定的通信端口发送出去,发送完成时将产生一个中断。接收指令(RCV),可以通过指令指定通信端口接收信息,并将其存储于接收缓冲区中。
用自由口通讯指令最多可以实现255个字符的数据交换,可以通过查询SM4.5和SM4.6的变化来判断是否发送完成。
数据缓冲区(TBL)操作数采用VB等;端口(PORT)为常数,其值的确定是依据所选用的CPU型号,TBL中数据存储格式如下:
表2.1 数据缓冲区格式
此外,完成自由口通信还必须对控制寄存器及特殊功能寄存器进行相关设置,设置格式如下:
表2.2 控制寄存器设置方式
表2.3 特殊功能寄存器功能表述
本设计采用PC/PPI电缆作为上位机和下位机的连接线,而PPI电缆的一端是RS485属于半双工通信方式,故接收和发送不可以同时进行,这里就涉及到一个接收指令和发送指令交替使用的问题。当PLC要发送数据时,必须保证接收使能位复位,而接收时还得需将接收使能位置位。关于使能位的置位和复位势必用到了接收信息控制字节即SMB87(SMB187),这也是在整个接收和发送过程中用的最频繁的控制字节。SMB87(SMB187)的位功能介绍如表2.4所示。对自由口端口初始化设置时,需分别为SMB30、SMB87、SMB94赋值16#09、16#B0和100。
表 2.4 接收信息控制字节的位功能
2.2 发送程序和接收程序的设计
在选择好自由口作为本次通信模式后,首先要进行协议的自定义,本设计中通信中采用的自定义协议如表2.5和表2.6所示。
表2.5 PLC向IPC发送数据格式
表2.6 PLC接收IPC数据格式
由于RS485的原因,接收和发送不能同时进行,所以要对接收和发送两个过程实现自动切换,使得接收和发送过程互不影响。本设计中采用定时器,是接收和发送子程序定时间隔执行。自由口通信下的接收程序在执行时必须保证接收使能位有效,即必须对SM87.7进行置位后,再执行RCV指令。
在使用XMT指令执行发送程序需要特别注意,在进行发送之前先必须将接收使能位(SM87.7)复位,同时再执行一次RCV指令,保证接收缓冲区的数据全部被读出,最后再执行XMT指令。
为了保证向上位机发送的数据准确可靠,PLC发送程序中加入发送数据的起始符和结束符号,以保证发送数据的准确,便于上位机采用查询方式接收数据。
3. 上位机通信程序设计
上位机程序中调用MSComm编写通信程序 ,波特率为9600bps、无校验、通信端口号为1,InputLen的值为1。
本系统在设计过程中为了迎合人们的习惯,决定采用十进制作为上位机数据输入格式,但是通信过程中数据以ASCII的形式参与各种运算,同时在PLC中实现ASCII转化功能最常用的指令是ATH,为了实现数据格式统一需要将待发送数据转化成十六进制的形式,相关函数为IntToHex()。
在MSComm控件下,为了保证数据的精确性,以免因数据传输问题而出错,采用将接收缓冲区中的数据以单字符形式接收,从接收到起始字符开始,一直到接收到结束字符为止的接收方式,接收程序段如下:
try
{ if(MSComm1->InBufferCount!=0)
{do
{tmp=AnsiString(WideString(MSComm1->Input));
X=X+1; //接收緩冲区加1
} while((tmp!="\x3E")&&(X<1024));// 数据起始字符为‘>’
X=0;//接收缓冲区清零
do
{tmp=AnsiString(WideString(MSComm1->Input));
temp=temp+tmp;//单字符拼装成字符串
X=X+1;//接收缓冲区加1
} while((tmp!="\x21")&&(X<1024));// 结束字符为‘!’
}
}
catch (...)
{ShowMessage("通信失败,请重试!");}// 通信异常时显示
for(int M=0;M<112;M++)
{ temp_int[M]=*(temp.c_str()+M);}// 将字符串拆分
for(int N=0;N<112;N++)
{ if(temp_int[N]==32)
temp_int[N]=0; // 遇到空格显示0
else if(temp_int[N]>=48)
temp_int[N]=temp_int[N]-48; //显示十进制数0~9
}
参考文献
[1]胡文金. 计算机测控应用技术[M].重庆:重庆大学出版社,2003.
[2]陈建明. 电气控制与PLC应用[M].第2版.北京:电子工业出版社,2007.
[3]陆卫忠. C++ Builder 6程序设计教程[M].北京:科技出版社,2005.