logo资料库

使用JAVA实现MODBUS协议通信.pdf

第1页 / 共6页
第2页 / 共6页
第3页 / 共6页
第4页 / 共6页
第5页 / 共6页
第6页 / 共6页
资料共6页,全文预览结束
·技术交流· 余曦使用JAVA实现MODBUS协议通信 93 使用JAVA实现MODBUS协议通信 余 曦 (福建古田溪水电厂福建省古田县352258) 【摘要】介绍了在MODBUS WigT,用JAVA语言实现网络通信的程序设计,分别对 ASCII和RTU两种模式下的程序设计进行详细的阐述。 【关键词】JAVA MODBUS协议ASCII RTU面向对象 【数据库分类号】SZ15 1 JAVA的优点 作为一种程序设计语言,它简单、面向对象、不依赖于平台,具有可移植性、鲁棒性、安全性,并提 供了并发的机制,具有很高的性能,还提供了丰富的类库,使程序设计者可方便地建立自己的系统。 JAVA语言的最大的优点具有跨平台性,在WIN95/98、NT、Solaris、UNIX、Macintosh都可使用相 同的代码。面向对象的语言,是通过提供最基本的方法完成指定的任务,JAVA语言的设计,集中于对 象及其接口,它提供了简单的类机制以及动态的接口模型,对象中封装了它的变量以及相应的方法, 实现模块化和信息隐藏,而类提供了一类对象的雏形,并通过继承机制,实现了代码的复用。 2 IVIODBUS通信协议 MOD S通信协议是MODIC0N公司为其控制器设计的,是在大量应用中已被证明的一种 可靠而有效的工业控制系统通信协议,它得到众多厂商包括SIEMENS、GE、Honeywell等支持。它 是一种主从结构的串行通信方式,实现对设备的访问和控制。 报文形式为请求/*l应帧方式,每次通信都是由主机发起,请求帧内容包括:从机的地址,功能 码,传输数据和校验码。格式如表1、表2。 表1读请求格式 从机号 功能码 首字地址 字数 校验码 lbyte lbyte 2byte 2byte 2byte 表2写请求格式 从机号 功能码 要写的字的首地址 写的总字数 写的总字节数 字的值 校验码 lbyte lbyte 2byte 2byt~ 2byt~ nhyte 2byte 主机发出请求帧后,从机判断请求帧中的从机地址是否与本机相同,确认功能码,然后发出响 收稿日期:2002—09—23。 维普资讯 http://www.cqvip.com
94 2003年2月 水电厂 自 动化 第1期总第9l期 应帧。响应帧内容包括:从机地址,功能码,返回数据和校验码。格式如表3、表4、表5。 表3响应读请求格式 从机号l功能码I读的字节数I首读字内容l I最后读出字内容l校验码 ■厂 ■厂 —厂 …。厂— — 表4响应写请求格式 从机号 功能码 被写字的首地址 被写字的字数 校验码 lbyte lbyte 2byte 2byte 2byte 表5标准的MODBUS协议提供两种传输模式。即ASCII和RTU模式 起始位 数据位 校验位 停止位 ASCII模式 lbit 7bits lbit lbit RTU模式 lbit 8bits Jbit lbit 因此,对于相同波特率的情况下,RTU模式的数据流量比ASCII模式大,所以一般情况下,采 用RTU模式。 3通信程序的实现 JAVA是一种面向对象(object)的语言,它的程序设计集中于对象及其接口,以下的图例是它 们的具体实现。实线为对象,虚线为接口。 I 厂…………一÷………--J Modbus :ModbusMessage ! M0dbusRcgistcrBan 厂—————] r一.L.一.一.一.一.] :::===i:: ::::::_ a v—e————Jl-o--d--b--u--s--A-—S—C I::1T::r:a]nsport Modb.us ransp。r r..—..J.— ________________。 :::::::::LI。。 ”。 。 ModbusASCIIHaster ModbusRTUMastor ModbusASCI1Master ModbusRTUslavc 软件设计如下: MODBUS程序: public class Modbus extends Object ∥变量定义 static {modbus.UINT8一MAX=255; modbus.UINT8.MIN=0; //定义从机地址范围 modbus.UINT16一MAX=65535: modbus.UINT16.MIN=0; //定义地址偏移量范围 } protected Modbus(ModbusTransport parModbusTransport) {super(); 维普资讯 http://www.cqvip.com
·技术交流· 余曦使用JAVA实现MODBUS协议通信 95 transport=parModbus Transport; return; } ∥创建构建函数 public boolean receiveFrame(ModbusMessage parModbusMessage) {return transport.receiveFrame(parModbusMessage); } ∥判断是否接收到报文 public boolean SendFrame(ModbusMessage parModbusMessage) {return transport.SendFrame(parModbusMessage); } ∥判断报文是否发送 ModbusMessage程序: public class ModbusMessage extends Object {变量定义} public ModbusMessage() ∥定义报文格式 {super(); buff=new byte[256]; length=0; transID=0; return; { ModbusTransport程序:∥报文传输接口程序 Public interface ModbusTransport {public boolean reeeiveFrame(ModbusMessage parModbusMessage); public Boolean sendFrame(ModbusMessage parModbusMessage); } ModbusBegisterBank程序:∥该程序建立数据缓冲区,并对缓冲区进行操作 以上是继承OBJECT的一级子类,下面是继承M0DBUS类的主/Sk机类程序,是OBjECT的 二级子类。 ModbusMester程序: public class ModbusMaster extends Modbus { : public ModbusMaster(ModbusTransport parModbusTransport) {super(parModbusTransport); request=new ModbusMessage(); response=new ModbusMessage(); return; } public boolean readinputRegistes(int INTA,int INTB,int INTC,int INTD,int[]IntArray) throws IllegalArgumentException { 维普资讯 http://www.cqvip.com
96 2003年2月 水电厂 自 动化 第l期总第9l期 request.buff[0]=((byte)((INTA>>0)&255)); request.buff[1]=((byte)4); request.buff[2]=((byte)((INTB>>8)&255)); request.buff[3]=((byte)((INTB>>0)&255)); request.buff[4]=((byte)((INTV>>8)&255)); request.buff[5]=((byte)((INTV>>0)&255)); request.1ength=6; request.translD=INTD; ∥建立读请求帧 if(!super.SendFrame(request)) return flase; ∥读数据请求帧 if(!super.receiveFrame(response)) return flase; ∥判断是否接收到响应帧 } public boolean writeMuhipleRegistes(int INTA,int INTB,int INTC,int INTD,int[]IntArray) throws IllegalArgumentException {∥发写数据请求帧 ∥判断响应是否正确 } Modbusslave程序: public class Modbusslave extends Modbus implements Rumble {∥变量定义 public Modbusslave(ModbusTransport parModbusTransport,int address) {super(parModbusTransport); ; request=new ModbusMessage(); response=new ModbusMessage(); slaveAdd=((byte)(address&255)); return; } private void processReadinputRegister() ∥处理读数据请求帧程序 private void processReadmultipleRegister() ∥处理读多字节数据请求帧程序 private void processWritemultipleRegister() ∥处理写数据请求帧程序 public boolean processRequest() ∥处理请求帧程序 { : if(request.buff[0]!=slaveAdd) return true; swith((int)request.buff[1]) {case 3: 维普资讯 http://www.cqvip.com
·技术交流· 余曦使用JAVA实现MODBUS协议通信 processReadmultipleRegister(); breadk; case4; processReadinputRegister(); breadk; case 16: processWritemultipleRegister(); breadk; } : } 下面是ASCII和I U两种模式分别对主/从机类程序,即ModbusMaster,Modbusslave类的继承 ModbusASCIITransport程序 功能:从串13发送和接收ASCII码,并有编码和解码功能 ModbusASCIIMaster程序: public class ModbusASCIIMaster extends ModbusMaster { : public ModbusASCIIMaster() {super((ModbusTransport)ModbusASCIIMaster.ASCIITransport); retum; } ∥ASCII模式主机程序 ModbusASCIIslave程序: public class ModbusASCIIslave extends Modbusslave { ; : public ModbusASCIIslave(int address) {super((ModbusTransport)ModbusASCIIMaster.ASCIITransport,address) retUm: } ∥ASCII模式从机程序 } ModbusRTUTransport程序 功能:从串口发送和接收RTU码,并有编码和解码功能 ModbusRTUMaster程序: public class ModbusRTUMaster extends ModbusMaster { public ModbusRTUMaster() ;super((ModbusTransport)ModbusRTUMaster.RTUTransport); 维普资讯 http://www.cqvip.com
98 2003年2月 水电厂 自 动化 第l期总第9l期 return; } //RTU模式主机程序 ModbusRTUslave程序: public class ModbusRTUslave extends Modbusslave { : public ModbusRTUslave(int address) {super((ModbusTransport)ModbusRTUMaster.RTUTransport,address) return; }//RTU模式从机程序 } 4结论 正因为JAVA语言面向对象,所以编程简单、灵活、易实现,在上述程序的基础上,也可以实现 MOD S/’rCP的通信协议,使用该协议可对远程数据的读写操作。 参考文献 [1]Ga Comell,CayS.Ho~tmann.OOlt~Jave.2000.1 ModioonMODBUS通信协议,1999. 余曦男,自动化班班长,助理工程师,从事电厂自动化方面的设计维护工作。 十三陵蓄能电厂通过无人值班验收 在广州蓄能水电厂通过验收后,2003年1月21~22日十三陵蓄能电厂也通过了无人值班验收,这 是国家电网公司成立后通过无人值班验收的第一个直属水电厂,也是我国通过无人值班验收的第二个 水电厂,使我国水电厂无人值班工作在2003年实现了开门红。 受国家电力公司发输电部的委托,由华北电力集团公司组织并组成以原国家电力公司发输电部《水 电厂无人值班若干规定》编写小组成员为基础的验收组,对照国家电力公司国电发[2o02]685号文件“关 于印发《水电厂无人值班的若干规定》的通知”的规定,结合十三陵蓄能电厂实际情况,进行了检查验收。 十三陵蓄能电厂是国家和北京市“八五”重点建设项目,安装了四台可逆混流式水轮发电机组,总装 机容量800 MW,主要机电设备从国外引进,附属设备由国内配套,作为京津唐电网的调频、调峰和紧急 事故备用电源,为保首都安全供电发挥了重要作用。 十三陵蓄能电厂具备如下两种控制方式,一种是由华北电网下达指令对机组的各种工况进行一对 一控制,在发电工况调度中心可以远方投入AGC,电厂按电网ACA2给定值进行负荷控制。另一种方式 是按照华北网调能量管理系统EMS下达的全厂总负荷值,根据机组最优负荷控制,自动进行机组启停。 目前主要采用第一种控制方式。 十三陵蓄能电厂2000年1月通过“无人值班”(少人值守)验收以来,在华北电力集团公司的领导 下,华北网调的大力支持下,对照国电发[2002]685号文对水电厂无人值班的各项要求进行了认真系统 的整改,7002年10月起已实现无人值班的实用化运行。2002年10月1日起至年底,机组开、停机成功 率99.88%、水泵工况启动成功率达100%,自动传呼On—Cal1人员进厂处理故障累计4次,间隔时间大 于168小时,这些指标均优于国电发[2002]685号文规定的指标,通过了验收。 (方辉钦) 维普资讯 http://www.cqvip.com
分享到:
收藏