开关信号串口采集系统设计
2020-02-04张意恺
张意恺
(西安交通大学 陕西省西安市 710049)
1 前言
本系统一共包含三个模块:PC 主控系统、RS232 四进四出控制模块、后端MySQL 数据库。实现的主要功能:通过串口,PC主控系统对外部控制器的4 个输入开关信号进行读入,并根据设定的规则进行4 路开关信号的输出控制。
PC 主控系统基于Visual Studio 2012 中的面向对象设计,界面的设计上采用MFC Dialog 类。Dialog 类的模态窗口给开发带来了极大的便利,其中大量控件在开发过程中能更好、更便捷地实现界面功能,大大减少界面可视化上的时间,从而可把主要精力放在核心的控制逻辑的实现上,同时又带给使用者良好的互动体验。
本系统中的四进四出控制模块可连接不同类型外部设备,实现不同控制效果,四个输入可以手动或自动触发。为确保整个操作过程可追溯,系统自动记录所有的操作日志,并写入到数据库中,通过标准化的SQL 查询语句,可实现按照日期或通道号查询,从而快速排除问题。
2 串口通信
2.1 PC上位机与模块通信连接
系统控制模块与电脑之间的通过RS232 通信接口连接,采用db9 标准。
2.2 串口通信
串口通信(Serial Communications)应用范围广泛、价格便宜、编程容易并且可以比其它接口使用更长的传输距离。一般使用3 根线就可通信,即地线、发送、接收。串口通信是异步方式,能够在发送数据同时接收数据。
串口通信主要参数为波特率、数据位、停止位和奇偶校验。两个进行通信的设备,相关参数必须一致。常用的通信为:9600,8个数据位,1 个停止位,没有检验位。
3 系统框架
见图1。
4 系统模块
4.1 RS232开关信号采集
系统使用RS232 控制模块进行信号采集,选用无源输入型,其包含四个继电器输出和四个光电隔离开关输入。
每个继电器引出三个接线端子,分别是 NO(常开端)、COM(公共端)、NC(常闭端)。继电器断开时,COM 与 NC 相通,COM 与 NO 断开。 继电器吸合状态时:COM 与 NO 相通,COM 与 NC 断开。
4.2 PC主控系统设计实现
控制端在Visual Studio 2015 环境下开发,基于面向对象设计。各类功能的实现主要通过MFC 程序的对话框编辑控件以及相关函数实现。
图1:系统框架
图2
系统主要包括chuankou.h,chuankouDlg.h,Rsource.h,stdafx.h, targetver.h 以及对应的.cpp 文件。
chuankouDlg.h 及对应cpp 文件实现主界面。在主界面中对整个系统进行操控。
cs.h 和对应cpp 文件实现参数选择界面。在参数选择界面中对串口通信的参数进行选择。
mscomm1.h 和对应cpp 文件为串口控件对应文件,是添加串口控件时系统生成,包含了打开串口关闭串口等串口相关函数。
para.h 和对应cpp 文件为串口参数文件。在主界面和参数选择界面之间传递串口参数。
此外工程中还包括了使用MySql 数据库所需要的资源文件。
系统运行效果如图2。
4.2.1 主要功能设计
4.2.1.1 系统初始化
系统主要包含:串口控制,继电器输出控制,信号输入控制,数据查询4 个主要功能。启动控制平台后,首先进行系统初始化:界面的显示元素初始化,包括各个控件,图标,静态文字;随后读取参数配置文件config,ini 中的数据库相关参数,包括IP 地址、用户名、密码、数据库名,调用函数连接数据库。如果连接失败,则弹出消息框提示使用者;如果成功,则继续运行,读取config.ini文件中的串口通信参数,存入在para.h 中定义的四个串口通信参数中,并打开串口,如果读取失败,则弹出消息框提示使用者选择串口通信参数再打开串口。待打开串口成功后便可操控系统。
4.2.1.2 串口控制
在使用系统之前需要打开串口与控制模块成功连接。串口控制区有一个Combo Box(下拉菜单)控件,三个Button(按钮)控件。下拉菜单控件选择端口号。三个按钮控件功能分别是调出串口参数选择界面、打开串口、关闭串口。
(1)“打开串口”按钮。当按钮按下,进入响应函数准备打开串口。首先判断串口状态,若异常打开则关闭。然后读取使用者所选择端口号,建立Combo Box(下拉菜单)控件的对象,调用GetCurSel()读取选项编号,由于下拉菜单控件的选项编号从0 开始,所以实际端口号为控件自身编号加一。接着设置串口缓冲区、读写方式、相关参数,打开串口,打开失败或成功都将在消息框中提示。打开成功后将当前串口4 参数(波特率,检验位,数据位,停止位)记录至config.ini 中更新数据。
(2)关闭串口。当需要对系统进行特殊操作,比如控制模块与其他设备的连接等,此时我们不希望关闭控制台,但是需要关闭串口以避免出错,所以设置单独关闭串口按钮,在关闭串口的同时,也会关闭只有在串口开启下才运行的进程,比如读取入开关输量定时器避免程序跑飞。关闭后会通过消息框提示串口已经关闭。
4.2.1.3 继电器输出控制
继电器输出控制有四组控件,每一组控件包含一个显示继电器状态的控件和一个控制继电器的按钮控件。每一组控件对应一个继电器。由于四组控件地位平等,并且代码上也仅有编号差别,下面仅对一组(第一组)进行说明。
控件有两个显示状态,黑色表示继电器状态是断开,红色表示闭合。为与按钮控件进行联动 ,创建一个控件的对象。
按钮控件控制继电器的状态。初始化时,默认控件为黑色(断开状态),按钮上文字显示为“k1 闭合”即按下按钮后k1 闭合。当按下按钮时,控件显示切换为红色,同时按钮文字显示切换为“k1断开”即再次按下按钮后k1 断开,同时,根据通讯协议R20 向控制模块发送k1 闭合的命令。成功后调用函数读取系统时间信息,将日期时间和k1 闭合的信息组合作为一条数据,调用自定义的函数insertmysqlout 插入到数据库com 的comlog 表格中。再次按下按钮时,控件显示切换为黑色,同时按钮文字显示切换为“k1 闭合”即再次按下按钮后k1 闭合,同时,根据通讯协议R20 向控制模块发送k1 断开的命令。成功后调用函数读取系统时间信息,将日期时间和k1 断开的信息作为一条数据,记录到数据库com 的comlog表格中。
4.2.1.4 信号输入控制
信号输入控制包含四个控件,一个Check Box(复选框),一个按钮控件。四个控件用来显示四个开关输入状态,黑色表示无信号输入,红色表示有信号输入。按钮每按下一次都会读取一次输入状态的并根据输入状态改变控件的显示。复选框只有在串口打开的状态下才可以使用。复选框被选中时,按钮变为灰色无法使用,并且设定一个定时器,每250ms 出发一次定时器事件,读取一次输入状态并根据输入状态改变控件的显示。
读取输入状态的过程:
在按钮事件和复选框事件中根据R20 通讯协议向控制模块发送获取输入状态的命令,控制模块将输入通道的状态用一串16 进制代码返回,并且暂存在接收缓存区中。由于返回时是将代码按字节传回,所以要使返回结果包含所有通道的输入状态,在打开串口前设置参数时缓存区进行如下设置“m_mscomm.put_RThreshold(6)”(m_mscomm 为串口控件对象),当接收缓存区有6及6 个以上的字节时,会触发串口控件事件。这样可以一次获得四个通道的状态。
在串口控件事件中,提取接收缓存区内容并且将其拼接为最终返回结果,根据结果判断四个通道的输入状态,改变四个控件的显示(调用min1、min2、min3、min4 四个控件下的函数加载),同时读取系统日期时间,并将日期时间、有输入的通道合并为一条数据调用上文提到的insertmysqlout 函数插入数据库com 的comlog 表格中。
4.2.1.5 数据查询区
数据查询区包括一个日历控件,一个文本编辑框,一个下拉菜单,两个按钮控件。一共有两种数据查询方式:一是按日期查询,对应日历控件和一个查询按钮;二是按通道查询,对应一个下拉菜单和一个查询按钮。查询结果将在本文编辑框中显示。
查询过程:调用日历控件对象或下拉菜单对象下的函数获取所选信息,组成CString 型的所要执行的sql 语句,再转化的char 类型调用mysql_query 函数执行以查询数据。
4.2.1.6 参数选择界面
参数选择界面包含五个下拉菜单以选择串口参数分别为波特率、数据位、停止位、奇偶校验位、流控制,使用者选择参数,保存至para.h 中对应的参数中,传递给主界面用以打开串口。如果配置文件中已经写有相关参数,则会读取并显示在下拉菜单中。
4.2.1.7 数据库模块
本系统中我们使用的是免费的社区版MySQL 数据库。MySQL是传统关系型数据库管理系统。
在开发过程中,使用Navicat Premium 数据库管理工具进行管理,及数据库、表设计、辅助调试。
利用Navicat Premium 创建名为com 的数据库,在其中添加名为comlog 的表。 表结构设计如下:
(1)id:在插入数据时自动生成并且设定为自动增长,作为主键,用于保证数据都不一样。
(2)cur_date:日期,在程序中获得。
(3)cur_time:时间,在程序中获得。
(4)waynum:通道号。
(5)inorout:输入或输出,0 表示输出(继电器),1 表示输入。
(6)operation:当通道为输出时,继电器闭合或断开,1 表示断开(switch off),0 表示闭合(switch on),可以为空。
(7)isDelete:逻辑删除标志位,可以对其赋值在筛选来达到逻辑删除的目的。