单位文秘网 2021-10-23 08:15:08 点击: 次
摘 要 西门子PLC常被用于工业现场的控制,而对其的监控往往是由上位机来完成的,因此PLC与上位机之间的数据通信问题就变得极其重要。本文介绍了利用Visual C++中的MSComm控件设计上位机通信界面,完成与西门子系列PLC的数据通信。实验证明,利用这种技术克服了以往通信系统受通固定信协议与组态软件的限制,性能可靠,使用灵活,适合于小型控制系统。
【关键词】西门子PLC 上位机 自由端口模式 MSComm控件 通信系统
随着工业技术的发展,可编程逻辑控制器(PLC)得到越来越广泛的应用。西门子S7-200 系列PLC是西门子家族中重要的一员,其体积小,软硬件功能强大,可靠性高,而且具有强大的通信能力。
设计采用自由通信口方式,由第三方开发软件Visual C++自行设计通信画面,实现计算机与PLC的通信。
1 系统实现方案
1.1 串口通信方案
MSComm控件是Microsoft公司提供专门用于串行通信编程的ActiveX控件。本次设计使用MSComm控件进行开发。在通信过程中,只需设置、监视MSComm控件的属性和事件即可完成对串行口的初始化和数据输入输出工作。
1.2 系统电路设计
本次设计所使用的PLC为直流电源系统的CPU226 PLC,其内置的电源模块只能给PLC的输入进行供电,其输出需要额外配置±24V电源,因此必须增加一个开关电源模块,给PLC的输出供电。
由于S7-200 系列PLC的通信口是RS-485通信接口,而计算机是RS-232通信接口,所以计算机与PLC通信时需要进行RS-232/RS-485电平转换,西门子PC/PPI电缆可以完成这一转换。本设计的电路连接图如图1。
1.3 系统功能实现
本系统可实现的功能有两部分:上位机发送数据和上位机接收数据。其中上位机发送数据是由上位机通过对话框发送一个字符数据,在PLC的输出QB0上显示输入数据的个数,输出QB1上显示输入数据的ASCII码;上位机接收数据是给PLC的IB0一个输入状态,在上位机主界面的接收区即可显示其输入状态。
2 上位机端程序设计
2.1 界面设计
使用控件进行串口程序设计时,首先需要加载控件。将MSComm控件加载到Visual C++集成开发环境中。加载成功后,建立一个基于MFC单文档对话框的工程,即可进行通信程序的设计。
通信界面包括两个部分:主界面和设置界面。主界面是主要的操作界面,设置串口参数、打开串口、关闭串口等操作都在主界面中完成。通信界面如图2所示。
界面设计之后,还需要使用Visual C++类向导自动创建静态文本、按钮和编辑框的关联成员变量,这样就可以直接通过成员变量来访问控件内容,例如在控件中显示内容、读取内容或者发送内容等。
2.2 程序设计
下面是打开串口程序的一部分,在这里进行部分初始化操作。
fbyComm.SetInBufferSize(1024);
//指定接收缓冲区大小
fbyComm.SetInBufferCount(0);
//清空接收缓冲区
fbyComm.SetInputMode(1);
//设置数据获取方式
fbyComm.SetInputLen(0);
//设置每次读取长度为全部读取
fbyComm.SetRThreshold(1);
//设置接收OnComm事件门限值
fbyComm.SetPortOpen(1);
//打开串口
2.2.1 接收数据处理
程序在MSComm控件的OnComm事件中接收数据。具体代码如下所示:
void CReceiveMSCommDlg::OnOnCommMscomm()
{
VARIANT variant_fbyp;
COleSafeArray safearray_fbyp;
LONG len,fbyk;
BYTE fbydata[2048];
CString strtemp;
if(myComm.GetCommEvent()==2)
//当值为2表示接收缓冲区有字符
{ variant_fbyp=myComm.GetInput();
//缓冲区的读取
safearray_fbyp=variant_fbyp;
//将VARIANT型变量转换为ColeSafeArray型变量
fbylen=safearray_inp.GetOneDimSize(); //获得到有效数据长度
for(k=0;k safearray_fbyp.GetElement(&k,rxdata+k); for(fbyk=0;fbyk {BYTE bt=*(char*)(fbydata+fbyk); strtemp.Format("%c",bt); //将字符放入临时变量strtemp中 m_edit1+=strtemp; }} UpdateData(FALSE); //更新编辑框内容 } 2.2.2 发送数据处理 当发送区有数据时,执行SetOutput()函数即可通过串口发送数据。然后可以通过将OutBufferSize属性值设置大一点来减少此种错误的发生。如下是该命令的代码: void CTTYReceiveMSCommDlg::OnButton1() {notification handler code here UpdateData(TRUE); myComm.SetOutput(COleVariant(m_send)); //数据的发送 } 3 PLC端程序设计 采用自由端口通信时,西门子PLC使用发送(XMT)、接收(RCV)指令进行数据收发。在通信之前,通过对SMB30(SMB130)写入数据,初始化系统,设置波特率,奇偶校验等。通信过程中,利用中断与子程序来完成数据的接收与发送,当输入缓冲区有数据时,跳转至接收子程序,将输入显示在输出QB0上;当需要发送数据时,跳转至发送子程序,使用发送指令(XMT)通过Port 0发送至上位机。 4 实验结果 通过“串口设置”按钮,设置通信串口参数为:“COM1”、“9600bps”、“无校验”,然后打开串口。把PLC端的程序下载上,调至RUN模式。给PLC的IB0一个输入状态00001000,在上位机主界面的接收区即可显示输入状态08。上位机发送数据与此类似。 5 总结 本设计选择自由端口模式,利用MSComm控件设计通信界面,克服了以往数据通信受固定通信协议与组态软件的限制,完成了上位机与PLC的通信。实验证明,此通信系统灵活性较好,可靠性高,而且开发成本较低,可直接用于工业现场的控制。 参考文献 [1]李江全等.西门子S7-200 PLC数据通信及测控应用[M].北京:电子工业出版社,2011. [2]刘书智.Visual C++串口通信与工程应用实践[M].北京:中国铁道出版社,2011) [3]钟茂生,王明文.软件设计模式及其使用[J].计算机应用,2002,22(8):32-35. [4]段军.单片机与PC机之间并行通迅的一种实现方法[J].计算机测量与控制,2000,8(2):32-34. [5]Ren Zhe.MFC Windows application design.Beijing:Tsinghua University Press,200. 作者单位 石家庄工商职业学院 河北省石家庄市 050091
地址:https://www.kgf8887.com/show-141-96642-1.html
下一篇:浅议电力系统继电保护技术及其前景
版权声明:
本站由单位文秘网原创策划制作,欢迎订阅或转载,但请注明出处。违者必究。单位文秘网独家运营 版权所有 未经许可不得转载使用