港口集装箱装卸模型监控系统

2014-02-03 03:14:16胡孔元朱华炳赵春海
实验室研究与探索 2014年1期
关键词:调用串口指令

胡孔元, 朱华炳, 赵春海

(合肥工业大学 a. 工业培训中心; b. 机械与汽车工程学院, 安徽 合肥 230009)

0 引 言

港口集装箱装卸模型由岸边吊、拖车、龙门吊、门座吊和货物集装箱模型组成,模型的平面布置图和现场布置图如图1、2所示。模型实现的功能:① 进港业务:岸边吊将货物从船上卸到拖车上→拖车运送→龙门吊将货物从拖车上卸到堆场。② 出港业务:龙门吊将货物从堆场装到拖车上→拖车运送→岸边吊将货物从拖车上装到船上。③ 模型的装、卸货运动。④模型的单个动作。本文研究目的在于如何实现由PC完成对模型实现控制与监视[1]。

根据模型的工作特点和应用要求,采用S7-200PLC为下位机、PC为上位机,通过串口通信的方式实现监控,而S7-200PLC与PC串口通信实现的方式有两种:自由口通信和PPI通信。采用自由口方式则PLC端和PC端都需要编写通信程序;而PPI方式采用主从结构,PC遵循PPI协议格式,发出读写申请,PLC返回相应的数据,可以省略编写PLC的通信代码,快捷方便[2-3]。本文采用PPI通信协议进行设计。

图1 模型的平面布置图

图2 模型的现场布置图

1 总体设计

1.1 通讯接口协议

S7-200PLC与PC实现PPI通信要先制定接口协议,本次通信接口协议如表1所示。

表1 通讯接口协议

1.2 S7-200PLC端设计要求

PLC外围电路使用限位开关、继电器控制电机和电磁铁工作[4]。

PLC要求接收PC指令完成对模型的运动控制,并向PC返回模型运行的状态信息[5]。模型的运动可分为三类:① 业务。图3为进港业务流程。② 单个模型的装、卸货。图4为门座吊卸货流程图。③ 模型的单个动作。

图3 进港业务流程图

图4 门座吊卸货流程图

1.3 PC端设计要求

PC要求完成对模型控制与监视。

(1) 控制。由PC发送写指令,PLC接受指令,控制模型进行相应运动。可发送的指令如下:① 当业务、岸边吊、拖车、龙门吊处于空闲或停止时,发送进港业务或出港业务指令;② 当业务、岸边吊(或拖车、龙门吊)空闲或停止时,发送岸边吊(或拖车、龙门吊)的装、卸货指令;③ 当业务或岸边吊、拖车、龙门吊单个运行或暂停时,发送停止指令;④ 当业务或岸边吊、拖车、龙门吊单个运行时,发送暂停指令;⑤ 当业务或岸边吊、拖车、龙门吊暂停时,发送继续指令;⑥ 当门座吊空闲或停止时,发送门座吊装、卸货指令;⑦ 当门座吊运行或暂停时,发送门停止指令;⑧ 当门座吊运行时,发送门暂停指令;⑨ 当门座吊暂停时,发送门继续指令;⑩ 当模型不处于业务及装、卸货运动时,发送单个动作指令。

(2) 监视。由PC发送读指令,PLC接受指令后返回相应信息,PC接受、处理、显示当前业务及模型的运行状况。PC可显示的状态如下:① 业务状态:空闲、进港、出港,暂停;② 各模型状态:空闲、装货、卸货、暂停;③ 单个动作状态:运行、停止。

PC端在完成上述设计要求的同时,还应保证系统稳定高效地运行。

2 S7-200PLC端程序设计

PLC端程序包括流程运动程序和单个动作程序。单个动作的程序简单,可采用基本指令编程;而流程运动的程序,根据其运动特点具有选择性和顺序性,还需采用顺控继电器指令编程。顺控继电器指令中SCR指令标示一个顺控步程序的开始,SCRT指令说明步序状态的转移去向,SCRE指令为顺控程序段的结束[6-7]。按控制要求设计出含有选择序列和并行序列的顺序功能图,最后绘制出梯形图。

在程序中,使用置位S与复位R指令完成Q输出[8];使用MOVB指令完成数据传送;使用通电延时定时器TON,控制集装箱起吊高度;使用位存储器M0.0、M0.1实现业务、岸边吊、拖车、龙门吊的停止、暂停与继续;使用位存储器M0.2、M0.3实现门座吊的停止、暂停与继续。

3 PC端程序设计

PC端采用Visual C++语言编写程序,设计流程运动监控和单个动作监控。其过程为先创建对话框工程、设计流程运动,再添加对话框资源、设计单个动作,最后设计辅助功能。辅助功能包括程序退出、界面切换和界面中“暂停”、“继续”按钮的切换。监控系统运行界面如图5所示。

(a) 流程运动监控界面

(b) 单个动作监控界面

3.1 流程运动监控设计

程序编写过程大体分为三步:① 新建对话框工程Do;② 控件资源创建[9]:图像、静态文本、MSComm、按钮;③ 函数实现:串口初始化、控制程序、监视程序。

3.1.1串口初始化

在成员函数OnInitDialog()中添加代码,完成如下设置:① 选择COM1;② 设置波特率9600,偶校验,8个数据位,1个停止位;③ 设置输入方式为二进制方式;④ 设置每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件;⑤ 设置输入缓冲区大小1024;⑥ 设置输出缓冲区大小1024;⑦ 设置和返回每次读出的字节数,设0为读出接收缓冲区中的内容;⑧ 设置和返回接收缓冲区的字节数,设0为清空接收缓冲区;⑨ 设置和返回发送缓冲区的字节数,设0为清空发送缓冲区;⑩ 判断如果串口没打开,则打开串口[10-11]。

3.1.2控制程序

在DoDlg.cpp文件中,设计如下程序:

(1) 增加全局变量。BYTE VB5=0。

(2) 增加成员函数send()。在该函数中向PLC发写指令[12-13]:

① 将成员变量VB5写入存储器VB5,发指令“68 20 20 68 02 00 7C 32 01 00 00 00 00 00 0E 00 05 05 01 12 0A 10 02 00 01 00 01 84 00 00 28 00 04 00 08 VB5 sk 16”;

② 调用SDK函数Sleep(DWORD dwMilliseconds)让程序暂停50毫秒后发送确认指令“10 02 00 5C 5E 16”。其中,sk为检验和,值随VB5变化,需调用成员函数sumchk (BYTE *temp)计算赋值。

(3) 增加成员函数。sumchk (BYTE *temp)。

(4) 增加按钮消息响应函数。分别为业务、模型运行、停止、暂停、继续按钮增加消息响应函数,在各函数中判断消息的执行条件,在if执行语句中,先给VB5赋值,然后调用成员函数send()。

3.1.3监视程序

在DoDlg.cpp文件中,设计如下程序:

(1) 在成员函数OnInitDialog()返回之前设置定时器。

(2) 增加时钟WM_TIMER消息响应函数。OnTimer(UINT nIDEvent)。在该函数中,实现如下程序:① 关闭定时器,② 调用成员函数Monitor(),③ 设置定时器。

(3) 增加全局变量。int bz=0;BYTE VB0=0;BYTE VB1=0;BYTE VB2=0;BYTE VB3=0;BYTE VB4=0。

(4) 增加成员函数Monitor()。

在该函数中设置for(bz=1;bz<4;bz++)语句,在循环内部向PLC发送读指令:

① 如果bz等于1,则读存储器VB0—VB4,发指令“68 1B 1B 68 02 00 6C 32 01 00 00 00 00 00 0E 00 00 04 01 12 0A 10 02 00 05 00 01 84 00 00 00 6C 16”,之后调用SDK函数Sleep(DWORD dwMilliseconds)让程序暂停20 ms。

② 如果bz等于2,则发读缓冲区指令,数据加入局部变量CString型data中,判断如果data等于“E5”,则发确认指令“10 02 00 5C 5E 16”,否则返回,之后同样让程序暂停50 ms。

③ 如果bz等于3,则发读缓冲区指令,数据加入已清空的data中,将data中第51、53、55、57、59位分别调用成员函数HexChar(char c)转换为char型数据,再利用强制类型转换转变为BYTE型,即分别表示存储器VB0—VB4中数据,将该值分别赋给成员变量VB0—VB4;添加if、else语句并根据VB0—VB4值调用成员函数WKstate(int nID, int s)和成员函数state(int nID, long ys)分别实现状态字和状态灯,其中,状态灯闪烁可利用延时和白色显示实现。

(5) 增加成员函数HexChar(char c)。

(6) 增加成员函数WKstate(int nID, int s)。在该函数中,首先,利用参数nID调用CWnd类的成员函数GetDlgItem(int nID)获得静态文本框对应的C++对象的指针,接着,利用该指针调用CWnd类的成员函数GetDC()获取当前文本框的设备描述表对象的指针,最后,在if、else语句中利用参数s调用CDC类的成员函数TextOut( int x, int y, const CString& str )实现文字输出[14]。

(7) 增加成员函数state(int nID,long ys)。在该函数中,首先,利用参数nID调用CWnd类的成员函数GetDlgItem(int nID)获得静态文本框对应的C++对象的指针,利用参数ys创建画刷,接着,利用上述指针获得该窗口的句柄,再利用句柄调用全局SDK函数GetClientRect(HWND hWnd,LPRECT lpRect)获取窗口客户区矩形的坐标,最后,利用指针构造CClientDC对象dc,利用该对象在矩形中间绘制一个白色边框的圆,圆内部为画刷颜色[15]。

3.2 单个动作监控设计

在对话框工程Do中添加对话框资源IDD_DIALOG1,为该资源添加新类CTestDlg,接下来在TestDlg.cpp文件中的程序设计过程与流程运动监控大体相同,不同之处在于:

(1) 将VB5和bz设置为成员变量,不再为全局变量。

(2) 本次读取的是存储器QB0—QB3中的值。发指令“68 1B 1B 68 02 00 6C 32 01 00 00 00 00 00 0E 00 00 04 01 12 0A 10 02 00 04 00 00 82 00 00 00 68 16”。

(3) 转变数据。将读取的数据data中第50和51位经过调用成员函数HexChar(char c)和强制类型转换,转变为BYTE型数据,即表示存储器QB0中数据,QB1、QB2、QB3依此类推。将得到的BYTE型数据利用成员函数dtob(BYTE temp)转换为CString型数据,其每一位分别对应存储器Q中的相应位。

(4) 增加成员函数dtob(BYTE temp)。

3.3 辅助功能设计

3.3.1程序退出与界面切换

(1) 按下“退出”按纽时程序退出。在该按纽消息响应函数中,设计如下程序:① 关闭定时器,② 判断如果串口打开则关闭,③ 调用CDialog类的成员函数OnCancel()。

(2) 按下“切换至下单个动作”按纽时进入单个动作监控界面运行。在该按纽消息响应函数中,判断如果业务和模型都不工作,则进行:① 关闭定时器,② 判断如果串口打开则关闭,③ 调用CDialog类的成员函数OnCancel(),④ 创建“单个动作”模态对话框[16];否则,调用CWnd类的成员函数MessageBox(LPCTSTR lpszText)提醒用户“请先停止或暂停业务及模型的运行!”。

(3) 按下“返回”按纽时进入流程运动监控界面运行。在该按纽消息响应函数中,实现如下程序:① 关闭定时器, ② 判断如果串口打开则关闭,③ 调用CDialog类的成员函数OnCancel(),创建“流程运动”模态对话框。

3.3.2暂停与继续按钮的切换

界面中“暂停” 按钮与“继续”按钮在同一位置处显示,两按钮的切换要满足:① 程序开始运行时“暂停”和“继续”按钮显示正确,② 按下“暂停”显示“继续”,③ 按下“继续”显示“暂停”,④ 按下“停止”显示“暂停”,⑤ 界面“返回”后显示正确。设计如下程序:

(1) 增加新类CNewButton,基类为CButton。

(2) 分别为“暂停”、“继续”按钮增加成员变量m_btn1、m_btn2,类型为CNewButton。

(3) 在CDoDlg类头文件中包含CNewButton类的头文件。

(4) 为CNewButton类增加CNewButton*类型的成员变量m_ptBtn。

(5) 在成员函数OnInitDialog()的最后,return语句之前添加代码实现让m_btn1和m_btn2中的变量m_ptBtn分别保存对方的首地址。

(6) 在“停止”按钮的if执行语句中分别利用m_btn1.m_pBtn和m_btn2.m_pBtn调用CWnd类的成员函数ShowWindow(int nCmdShow)让“继续”隐藏、“暂停”可见。

(7) 在“暂停”按钮的if执行语句中实现“继续”可见、“暂停”隐藏。

(8) 在“继续”按钮的if执行语句中实现“继续”隐藏、“暂停”可见。

(9) 在成员函数OnTimer (UINT nIDEvent)中添加代码,判断如果VB5等于0,在if执行语句中,判断如果VB0、VB1、VB2或VB3等于4,则实现“继续”可见、“暂停”隐藏,否则,让“继续”隐藏、“暂停”可见。

(10) 在“切换至下单个动作”的条件执行语句中将VB5赋值为0。

另外,界面中“门暂停”与“门继续”按钮的切换程序参照上述设计。

4 结 语

本文详细叙述了港口集装箱装卸模型监控系统设计过程。使用S7-200PLC为下位机、PC为上位机,应用PPI通信协议,PLC端程序采用基本指令和顺控继电器指令编写,PC端程序采用Visual C++语言编写。高效稳定地实现以下功能:

(1) 模型在流程运动监控界面和单个动作监控界面中的运动控制、业务及各模型的当前状态的实时显示。

(2) 流程运动监控界面中“进出港”监控和“门座吊装卸货”监控分离,两者可以随时执行,相互独立。

(3) 流程运动监控界面与单个动作监控界面的切换。

(4) 界面中“暂停”与“继续”按钮的切换。

[1] 张新艳,张 煜,王少梅,等.基于虚拟现实的港口集装箱码头装卸系统仿真建模技术[J].武汉理工大学学报,2001,25(4):470-473.

ZHANG Xin-yan,ZHANG Yu,WANG Shao-mei,etal.Simulation Modeling Technique of Virtual Reality-based Container Terminal Operation[J].Journal of Wuhan University of Technology,2001,25(4):470-473.

[2] 田 敏,郑 瑶,李江全,等.Visual C++数据采集与串口通信测控应用实战[M].北京:人民邮电出版社,2010.

[3] 王三秀,蒋胜韬.S7-200系列PLC与PC间基于自由口通讯的实现[J].科学技术与工程,2008,8(23):6357-6360.

WANG San-xiu, JIANG Shen-tao. Realization between Siemens S7-200 and PC Based on Freeport Communication[J].Science Technology and Engineering,2008,8(23):6357-6360.

[4] 胡孔元,朱华炳,曹 斌.基于PLC的港口集装箱码头装卸模型下位机控制系统设计[J].实验室研究与探索,2012,31(4):58-61,157.

HU Kong-yuan,ZHU Hua-bing,CAO Bin.Design of a Lower Computer Control System of Container Terminal Handling Models Based on PLC[J].Research and Exploration in Laboratory,2012,31(4):58-61,157.

[5] 纵 恒,王文伟,陈阳娟.大型石油化工储罐区消防安全系统设计[J].合肥工业大学学报:自然科学版,2012,35(9):1259-1263.

ZONG Heng,WANG Wen-wei,CHEN Yang-juan.Fire Safety System Design for Large Petroleum Storage Tank Area[J].Journal of Hefei University of Technology:Natural Science,2012,35(9):1259-1263.

[6] 秦绪平,张万忠.西门子S7系列可编程控制器应用技术[M].北京:化学工业出版社,2011.

[7] 西门子(中国)有限公司.SIEMATICS7-200可编程序控制器系统手册[Z].2008.

[8] 关 明,周希伦,马立静,等.基于PLC的机械手控制系统设计[J].制造业自动化,2012,34(7):120-121,142.

GUAN Ming,ZHOU Xi-lun,MA Li-jing,etal.Control System Design of Manipulator Based on PLC[J].Manufacturing Automation,2012,34(7):120-121,142.

[9] 吴倩颖,高峻峣,朱建国.计算机与PLC通信技术在煤矿探测与救援机器人中的应用[J].机床与液压,2012,40(8):110-113,116.

WU Qian-ying,Gao Jun-yao, ZHU Jian-guo.Application of the Communication between Computer and PLC in Coal Mine Detecting and Rescue Robot[J].Machine & Hydraulics,2012,40(8):110-113,116.

[10] 袭建伟,熊光明.Visual C++/Turbo C串口通信编程实践[M].第2版.北京:电子工业出版社,2007.

[11] 刘书智,李琳娜.Visual C++实践与提高:串口通信与工程应用篇[M].2版.北京:中国铁道出版社,2009:12-292.

[12] 何赛松,徐 雷.PLC与PC机的串行通讯在数控管切割机中的应用[J].机械设计与制造,2012(1):49-51.

HE Sai-song,XU Lei.Application of Serial Communication between PC and PLC in CNC Tube Cutter[J].Machinery Design & Manufacture,2012(1):49-51.

[13] 张瑞卿,胡爱军,张 超.基于VC++的PC机与PLC串口通讯的实现[J].制造技术与机床,2010,(9):58-61,30.

ZHANG Rui-qing,HU Ai-jun,ZHANG Chao.The Realization of Serial Communication between PC and PLC Based on VC++[J].Manufacturing Technology & Machine Tool,2010,(9):58-61,30.

[14] 罗浩菱,潘英俊,任春华,等.基于Visual C++的惯性导航数据采集系统[J].压电与声光,2012,34(1):46-50.

LUO Hao-ling, PAN Ying-jun, REN Chun-hua,etal, Development of Data Acquisition System for Inertial Navigation System Based on Visual C++[J], Piezoelectrics and Acoustooptics,2012,34(1):46-50.

[15] 张克涵,张呼和,顾李冯.VC++环境下的电机状态监测软件设计[J].测控技术,2012,31(2):23-26,30.

ZHANG Ke-han, ZHANG Hu-he, GU Li-feng. Software Design for Motor State Supervising by VC++[J]. Measurement & Control Technology, 2012,31(2):23-26,30.

[16] 郑阿奇.Visual C++实用教程[M].第4版.北京:电子工业出版社,2012.

猜你喜欢
调用串口指令
听我指令:大催眠术
浅谈AB PLC串口跟RFID传感器的通讯应用
核电项目物项调用管理的应用研究
LabWindows/CVI下基于ActiveX技术的Excel调用
测控技术(2018年5期)2018-12-09 09:04:46
ARINC661显控指令快速验证方法
测控技术(2018年5期)2018-12-09 09:04:26
LED照明产品欧盟ErP指令要求解读
电子测试(2018年18期)2018-11-14 02:30:34
基于系统调用的恶意软件检测技术研究
USB接口的多串口数据并行接收方法探索
基于蓝牙串口适配器的GPS接收机与AutoCAD的实时无线通信
地矿测绘(2015年3期)2015-12-22 06:27:26
基于并行控制的FPGA多串口拓展实现