基于C#的自动上料机监控软件开发
2019-01-08王东
王东
摘要:利用C#语言基于MODBUS通信协议开发了自动上料机监控系统,该系统实现了对设备的手动、自动控制和监视,并能对相关的运行参数进行设置,介绍了系统开发中的主要方案及关键技术,经实际验证,该系统稳定可靠,达到了预期的目标。
关键词:上位机;MODBUS-ASCII;串口;监控
中图分类号:TP39 文献标识码:A 文章编号:1007-9416(2019)10-0008-02
某自动上料机用于将工件传输给测试设备进行测试,该上料机有3个放料区,分别为待测区、PASS区、FAIL区,完成从待测区取料,送料给测试设备,测试完成后取回并根据测试结果(好或坏)将工件自动进行分捡放置到PASS区和FAIL区;3个放料区都由马达和相应的传感器来控制,根据物料的高度自动升降料台,以使料台保持在合适的高度,方便上料机抓取和存放物料。该设备涉及启动按钮、安全光栅、限位开关等输入端口40个,气缸控制、直流电机控制等输出端口16个,并由下位机直接控制,为了便于对设备进行操作、监视、控制和设置参数,开发了自动上料机的监控软件,采用串口与下位机进行通信,为了确保通信的稳定可靠,采用了MODBUS-ASCII通信协议。
1 上位机功能介绍
根据上料机的工艺要求,本监控软件由自动运行,工艺设置,输出状态,输入状态,手动控制,报警信息,电机参数等七个模块构成,各自完成相应的功能,具体功能需求如图1所示。
其中:自动运行主要用于监视运行时物料及测试相关的2个主要参数,设置错开放板数量和测试速度,显示当前测试通过和测试失败的数量信息,以及对设备的紧急控制和启动等。
工艺设置主要是进行马达控制、行程设定、气缸控制以及马达的参数设置。
输出状态:主要是各电机的正反转控制,以及各端口的输出状态。
输入状态:主要显示各输入端口的状态,用于显示监控。
手动控制:主要用于手动控制各执行机构的动作。
电机参数:主要用于设置各驱动轴的各项电机控制、气缸控制参数等。
2 上位机系统设计
本系统运行环境为WINDOS 7及以上系统,C#语言是微软公司发布的一种面向对象的、运行于.NET Framework和.NET Core(完全开源,跨平台)之上的高级程序设计语言。能使用SerialPort类库直接进行串口通信程序的开发,并且提供了事件驱动模式,开发方便,WINFORM程序开发非常适合上位机软件开发,所以本系统采用C#语言开发。
2.1 界面设计思路及关键方法
根据上位机的功能需求,使用WINFORM绘制所需要的界面及相关的控件,具体如图2(以自动运行为例)。
由上图可知,软件分为左侧的功能选择区和右侧的功能实现区,左侧功能选择区包含7个按钮(锁定除外),对应右侧会包含7个界面,但任一时刻只显示和左侧选择的功能相对应的一个功能实现界面,为方便后期各功能界面之间的切换,每一个功能实现区所有控件组合成一个用户自定义控件(UserControl)放到一个Panel控件中,故将整个界面分为两部分:一是workbench,即整个软件的主要界面,该workbench左侧包含了各功能选择按钮区和右侧的一个大的Panel控件,其中Panel控件用来作为各功能实现区用户控件的容器;二是右侧的功能实现区,功能实现区实际是前面所述用户自定义控件(UserControl),是放在Panel中的一个控件,每个控件对应左侧的一个功能按钮,所以一共需要定义7个用户自定义控件。
为了保证软件的可靠性和可维护性,软件界面只能有一个实例,所以使用singleton模式来构建用户界面(workbench),对应的界面类名MainFrom,定义singleton类:WorkBenchSingleTon,并定义MainFrom类型的私有类成员workBench,同时定义公开的静态属性WorkBench,但只提供外部对workBench的获取,方便在整个软件中其它控件对workBench访问的同时又保证了只有一个workbench,具体代码如下:
public class WorkBenchSingleTon
{
private static MainForm workBench = new MainForm();
public static MainForm WorkBench {
get{
if (workBench == null) {
workBench = new MainForm();
}
return workBench;
}
}
}
2.2 通信功能实现
根据该系统的整体设计方案,上位机与下位机之间的通信采用串口通信,且为了保证通信的可靠性使用MODBUS-ASCII通信协议。为了开发的方便,使用开源的类库NMODBUS,NMODBUS基于.NET封装了MODBUS协议的各项功能,使用方便,在此将NMODBUS提供的Master类作为workBench的成员,同时提供公开访问器,不提供賦值,也确保整个系统中只有一个Master被实例化。各项参数的初始化都在MainForm的构造函数中进行。
由前面的分析可知,右侧的功能实现区,都需要和下位机通过MODBUS进行通信,而MODBUS的特点是通信由主机发起,从机不能主动发起通信,在此系统中,上位机为主机,下位机为从机,所以所有的通信都由上位机发起。上位机要实时获取从机的数据,必须以一定的时间间隔不停地向从机发送查询命令,而本系统中,每个功能选择都对应一个功能实现区,但同一时刻只有一个功能实现区才被显示,故只需要查询被显示的功能实现区中所需要的数据,其它的不用显示,也就不需要向从机查询。根据MODBUS通信的特性,需要定时向从机查询数据,若每个功能实现区均使用定时器定时查询,则需要判断自己当前是否被显示来确定是否访问下位机,容易造成多个功能实现区同时访问从机造成软件通信不稳定,软件不易维护等问题,因此定义一个接口IBaseControl,作为各功能实现区的接口约束,其中ReadModbusInfo用于实现各功能实现区需要向从机读取数据的函数,而Title用于标识各功能实现区的名称,其接口如下:
interface IBaseControl : IDisposable
{
string Title{get;set;}
bool ReadModbusInfo();
}
因此在各功能实现区只需要实现ReadModbusInfo成员函数,实现需要读取下位机数据的逻辑,而自身并不需要调用该成员函数。而将所有调用该函数的职责放到workBench中,在workBench中定义一个定时器,在定时器的事件响应函数中调用当前显示的功能实现区的ReadModbusInfo接口函数即可,这样所有功能实现区读取从机数据的函数调用都集中在了一处,会自动根据当前显示的功能实现区而自动调用相应的ReadModbusInfo实现函数,方便软件维护的同时提高了稳定性。需要注意的是,由于使用了串口通信,其数据接收在另一个线程中实现,所以在更新界面数据时,需要使用到委托才能更新数据。
对从机的控制命令,同样集中在workBench中,功能实现区的用户控件需要向从机写数据时只需通过WorkBenchSingleTon.WorkBench.Master.WriteSingleCoil()语句调用workbench中定义的写寄存器函数向从机写入相应的数据即可实现向下位机发送命令。
3 结语
通过对自动上料机功能的分析,合理划分软件功能和实现方式,提高了软件的可维护性和稳定性,经现场测试,本上位机软件系统运行稳定,与下位机的通信可靠达到了预期的目标。
参考文献
[1] 李植鹏,徐政.设计模式在高压直流输电设计软件包中的应用[J].电力建设,2013,34(11):17-21.
[2] 夏浩波.单例模式的设计与应用[J].电脑开发与应用,2011,24(01):58-59.
[3] 代涛,杨丽红.基于C#的空调压缩机声强测試平台设计与实现[J].农业装备与车辆工程,2019,57(01):75-79.
[4] 吕志刚,鲁可心,李亮亮.基于C#的变电站运行参数监控系统设计[J].工业控制计算机,2018,31(07):32-33+36.
[5] 杨少朋,赵龑骧.基于C#的温湿度传感器串口通信程序的实现[J].中国新通信,2019,21(15):22.