基于RS232协议的工业显示器控制系统设计实现
2015-08-02殷洁张忠能
殷洁,张忠能
基于RS232协议的工业显示器控制系统设计实现
殷洁,张忠能
随着互联网逐步深入企业的日常运作,越来越多的企业产品开始依赖互联网进行工作。因为,传统的设备大多拥有自己的编码标准和底层通信机制,如何有效地通过互联网控制传统的设备已经成为一个新的课题。论文实现的远程控制系统,以LG工业显示器为例分析了这类设备,并通过RS232工业接口实现了互联网发送控制指令经终端中转后控制设备的过程,使得控制设备不再受到地点因素影响。
RS232;远程控制;C/S架构
0 引言
随着互联网的不断发展,社会进入网络时代。越来越多产品利用互联网为用户提供便利,物联网的概念更是期望将互联网应用到人们生活的方方面面,控制任何人们需要操控的工具。但另一方面,仍有相当的传统设备,如显示器等,由于拥有自身和PC端的底层通信机制及命令的编码规范,暂时无法直接通过互联网直接控制。
论文主要针对工业显示器进行研究,设计了基于C/S框架的系统,完成了通过网络发送命令到与显示器相连的终端,终端转换后通过RS232端口控制设备并将结果通过网络进行返回的工作。
1 工业显示器控制系统分析
工业显示器控制系统(以下均称本系统)的目的在于控制工业显示器。通过该系统,用户可以远程通过网络控制设备,并且能够得到设备的反馈以确定指令是否完成。
整个系统构建在RS232接口通信协议之上。工业显示器的接口多为RS232串行接口,这是一种9针接口,被广泛应用于计算机串行接口与外设的连接。不同设备针对RS232的9针接口都有不同的定义,每一个端口被赋予其特定的意义,可以通过编程对其赋予高电平以激活该接口。本文中以LG工业显示器为例进行分析,其管脚定义如图1所示:
图1 LG RS232管脚定义
相对应地,不同设备的控制命令编码方式也不同,系统需要针对不同显示器以及希望其完成的功能组装命令然后通过RS232接口传输到设备中。LG设备的命令格式如图2所示:
图2 LG 命令格式
该命令中,数据项由两个byte组成,在电源开/关命令中,00表示电源开,01表示电源关。设定ID为显示器设备的ID号,可调整范围为1~99,在组装命令时以0x0~0x63表示(十六进制)。Cr表示回车。
对于该命令,设备接收并执行后会进行返回,如果执行成功,返回命令的格式图3所示:
图3 LG 执行执行成功后返回
如果指令执行失败,则OK的数据位由NG代替。
基于以上基础,系统实现了LG的命令组装和RS232的通信协议以进行对设备的控制,同时应用JDK网络编程实现了对设备的远程控制。配合服务器端软件,人们可以在任意地点实现对工业显示器的控制。
2 设计与实现
2.1 控制系统的设计
整个远程控制系统的设计,采用C/S架构,前台与后台使用java开发,与底层通信基于Rxtx库,前后台之间的通信则采用socket。同时解决了客户端同时控制多台设备以及因此而来的返回与指令不匹配问题。整个系统的架构如图4所示:
图4 控制系统架构图
本地控制软件运行在播放器中。
整个系统的本地模块由3个部分组成:1、环境设置模块2、设备实例管理模块 3、监听及消息处理模块。
环境设置模块只用于加载rxtx底层通信库,一般而言rxtx提供两个不同的动态链接库(DLL)以便开发者进行并行接口(Parallel)或者串行接口(Serial)的通信开发。加载dll可以选择将dll拷贝到jdk的对应目录下由jdk在编译的时候自动调用。也可以选择将dll文件放在开发项目目录下,通过程序进行加载。本系统中为了可以直接使用,不需要额外的环境配置操作,采用程序加载的方式。
设备实例管理模块,在软件启动后将自动申请一个设备实例,实例中设置与设备通信的参数,用于管理与这个终端管理软件对应的设备,设备可能有多台,但与终端相连的只有一台,其他设备则通过串联方式相互连接。如图5所示:
图5 设备串联模式
监听及消息处理模块,完成指令由终端pc发出后,设备执行指令的监听及返回结果收集的工作。系统中每一次远程命令到达,系统会开启一个线程针对这条命令进行处理。监听和消息处理模块采用回调机制来区分每一次的命令执行,配合使用信号量系统来监听指令执行是否超时。整个系统设计架构如6图所示:
图6 系统设计架构
2.2 控制系统实现
2.2.1 环境设置
本系统并未采用将dll文件放入jdk动态加载目录下的做法,而是直接在项目以代码加载dll动态链接库。
String path=System.getProperty("user.dir");
System.load(path+File.separator+"rxtxParallel.dll");
System.load(path+File.separator+"rxtxSerial.dll");
其中user.dir将定位到安装包生成后与安装包平级的地址。故而后期生成exe安装包后需要将rxtx的两个dll文件放到与之对应的地方。
2.2.2 控制命令解析与填充
远程命令通过socket以json格式传输到控制端,程序中需要取出其中的cmd字段并重新填充命令。
JSONObject jsobj=JSONObject.fromObject(src);
String cmd=jsobj.getString("cmd");
首先获取json object,即在服务器端发送命令时生成的json实例,然后从obj中取出被编码的字段cmd。
获取cmd后需要生成传输到设备的命令,系统实现了一个接口类(interface)ControlCommond,应用多态方法,实现了可扩展的命令生成接口。对应不同的设备,只要实现这个接口,并对应实现每条命令的填充即可,无需对每个设备单独建立一个命令类。
controlCommand接口类中要实现的接口类型如下:
byte[] powerOn(int screenNo);
byte[] powerOff(int screenNo);
byte[] setContrast(int value, int screenNo);
……
每一个函数都需要返回一个byte数组,即设备可以执行的命令。系统实现了LG设备的命令集,以powerOn命令为例:
public byte[] powerOn(int screenNo)
{
String screenNoString = String.valueOf(screenNo);
byte[] screenNoBts = screenNoString.getBytes();
byte[] cmd = new byte[9];
cmd[0] = (byte)'k';cmd[1] = (byte)'a';cmd[2] = 0x20;
if (screenNoBts.length == 2)
{cmd[3] = screenNoBts[0];
cmd[4] = screenNoBts[1];}
if (screenNoBts.length == 1)
{cmd[3] = 0x30;cmd[4] = screenNoBts[0];}
cmd[5] = 0x20;cmd[6] = 0x30;
cmd[7] = 0x31;cmd[8] = 0x0d;
return cmd;
}
其中0x30代表ascii码中值,对应空格,其余类似。需要注意的是设备号如果只有一位需要自动填充一位空格,否则指令长度错误。
2.2.3 设备实例生成
系统启动后会自动生成一个设备实例,实例生成时需要设置与设备通信的一些参数,以LG设备为例如表1所示:
表1 系统生成LG设备实例参数
系统同时需要获取一个串行接口实例,即serialPort端口实例,这个实例被用于与设备进行交互。
首先通过程序读入portName,根据portName获取CommPortIdentifier,最后调用serialPort.open方法获取serialPort实例。
获取serialPort实例后就需要对实例设置参数。参数值如表2所示
表2 LG端口参数设置
对于serialPort,还需要关注从管道中返回的事件,对于每一个事件都可以定义相对应的代码去处理这个事件被触发时系统将进行的操作如表3所示:
表3 LG返回事件
这里我们只关注notifyOnDataAvailable事件即可,即处理当有数据返回时的命令解析工作。
当serialPort获取成功,所有监听设置完成,输入输出管道绑定到device实例上之后,一个完整的设备实例便生成成功。
2.2.4 消息监听处理
每一条命令从serialPort的输入管道写入设备时,系统开启一个线程去进行操作,写入工作完成后就运行waitForResponse()函数,这是一个DataEventListener类中的函数,用于等待信号,生成信号量。而notifyOnDataAvailable事件监听中会调用DataEventListener类中的另一个函数,与之对应,即dataEvent函数,用于消除信号量。通过信号量的匹配,来完成命令的执行结果返回的解析工作。每一条命令所处的线程都将维护这样一对函数以保障程序运行。
3 技术难点
系统在实现过程中主要遇到了以下3个问题,具体描述以及解决方案如下:
技术难点 解决方案多种设备兼容 server存储及本地接口多命令返回混乱 多线程及信号量作为服务自动运行 Exe4j加jar打包
3.1 多种设备兼容方案设计
系统在设计之初就希望能够兼容多种设备,不同厂商的显示器设备虽然在通信接口上基本都选用RS232接口,但在命令组成封装上却各有不同。在实现时希望能够尽量将命令不同对代码的影响减小,尽量在命令生成模块处理解决这个问题。
针对这个问题,设计了两种解决方案。一是在服务器端加载命令,即将所有命令储存在服务器上,然后针对不同的设备发送命令。这种方式需要在客户端启动时向服务器注册设备类型,如果设备发生更换需要重新注册,造成额外网络负载。服务器端的逻辑处理也将非常复杂,因而放弃了这个方案。
另一个方案是在本地将代码封装成一个interface接口类,运用java编程中的多态技术,新增设备后即在本地实现interface接口类,在其中将不同命令用对应函数名的函数进行封装。对于外部而言,只需要生成对应的接口类实例即可。这种方式将变量控制在本地,服务器只需要发送希望完成的操作,在本地进行命令生成。没有多余网络负载。因而实现时采用此方法。
3.2 多命令返回混乱解决方案
每一条命令被送到设备执行时都需要时间,不是立即返回的。而在执行过程中可能会出现新的指令。在主线程中操作会造成线程阻塞。
因而在每一条命令从服务器端到达终端并重新生成指令后,客户端都会开启一个新的线程去执行指令,避免了线程阻塞。
但随之而产生了另一个问题,即不同指令,执行时间可能不同,有的指令可能执行失败导致超时,使后续指令的返回与输入不对应。
为了解决这个问题,系统中引入了信号量和同步(synchroniz)机制。每一条命令发送之前会更新信号量的值,而每一次命令的返回都进入一个synchronized的函数,即这个过程中只有一个线程(即一个设备返回)会进入这个处理过程。保障了返回的唯一性,超时也会进入这个函数,对应更新信号量,以达到标志这个命令的处理结束的目的,下一次进来的返回是下一条命令的返回。
通过多线程和信号量以及同步机制,严格控制了指令与设备返回的对应。
3.3 终端软件作为服务自动运行解决方案
考虑到用户的使用习惯,不希望在启动终端后还需要单独打开本系统。
为了解决这个问题,系统将程序打包成为一个windows service服务。需要先将用Eclipse开发的程序打包成jar包,然后通过exe4j软件在打包成exe时选择executable type为service。并将需要用到的库文件包含进去一起打包。最后,还需要将rxtx的两个dll文件随exe文件一起封装,否则在程序内加载时找不到文件会导致windows service不能运行。
4 应用与分析
4.1 应用实例
工业显示器控制系统采用C/S架构,运行时需要一台后台服务器,服务器需要配置JDK环境。用户只需要在服务器端配置需要控制的设备所连接的终端PC的ip地址和端口,然后启动服务器即可。
软件中可以填写希望控制的设备所对应的终端ip地址并选择对应的命令,通过socket传输到对应终端并通过终端控制设备。
4.2 用户体验与实用性分析
由于工业显示器在性能上的提升,越来越多的场合需要工业显示器进行播放展示。且随着技术的进步,出现了多台显示器拼接显示等等新的展示手段,扩大了屏幕的尺寸,提升了展示的效果。
对应的,人们希望不再是展示单一的内容,这就需要终端对显示器的控制更进一步,在网络条件允许的情况下,通过网络传输播放内容并对设备进行控制。无论需求如何,第一步总是完成对设备的控制,本系统主要关注的正是这个问题,已经在一些公司投入实际使用。可以想见,在未来的生产生活中,本系统的适用范围会更广。
系统在开发过程中,将易于使用放在首位。在界面上尽量做到不需要用户输入,只需要进行
选择即可。所有指令均预先在程序中实现,减少用户输入不仅优化了用户体验,更加减少了用户输入错误带来的系统崩溃可能性,提升了系统的容错性能。
在设备的控制方面,从底层rxtx到上层的多线程信号量处理,保障了对设备的精确控制。对于每条指令均监视其返回,确保返回与指令的对应。通过socket返回给控制端,精确的返回可以帮助用户了解远程设备的工作状态。
5 结束语
随着互联网的飞速发展,越来越多传统产品借助互联网开启了新的使用方式。本系统从终端出发,实现了远程管理者对不同终端所连接设备的控制。简化了操作,提高了系统容错性,有效提升了整个系统的可靠性与实用性。
[1] 张红兵,孙士平,赵永泉.RS-232接口转换为USB接口的设计原理[J].现代计算机,2002(2):23-26.
[2] 葛磊蛟,毛一之,李歧等.基于C语言的RS232串行接口通信实现-河北工业大学学报,2008(6):12-14.
[3] 艾红,王捷,厉虹,万明明.基于串行接口的汉字液晶显示模块应用与开发-液晶与显示,2006,21(3):254-259.
Industrial Monitor Control System Base on RS232
Yin Jie, Zhang Zhongneng
(Shanghai Jiaotong University, Shanghai 200030, China)
Along with the Internet go deep into the daily operation of companies, more and more products are working with the Internet. Because most of the traditional device has its own coding standards and communication mechanism, how to control these devices effectively has become a new topic. This paper is based on implement a system, based on the research of LG industrial monitors, which can take and translate orders from the Internet and control devices by sending them to the devices via RS232. So that the control is no longer subject to location factors.
RS232; Remote Control; C/S Framework
TP311
A
2014.11.16)
1007-757X(2015)01-0040-04
殷 洁(1989-),男,江苏南通,上海交通大学,硕士研究生,研究方向:计算机应用,上海,200030
张忠能(1958-),男,上海,上海交通大学,副教授,研究方向:计算机应用,上海,200030