最近项目分给我一个任务模拟写RTU的客户端程序,和一个产品的用户手册,所以没怎么更新。现在对这
段时间接触到的东西做个总结。
1. 打开页面时显示为下载页面。看到一个同事出这个错误。结果是头文件没写好
<%@page contentType="text/html" pageEncoding="GB2312"%>少了分号。
2. 设置JTable的列数。
DefaultTableModel tableModel = (DefaultTableModel) Table.getModel();
tableModel.setRowCount(clientArray.size());
3. 在使用SocketChannel时容易犯的错误:
1. 发送数据时:
public void sendRequest(SelectionKey key) {
SocketChannel channel = (SocketChannel) key.channel();
Map<Integer, List<ByteBuffer>> writeCache = ServiceCache.getWriteCache();
List<ByteBuffer> list = writeCache.get(this.getSiteAddr());
if (list != null && !list.isEmpty()) {
try {
// System.out.println("写缓存有数据,发送数据");
//刚开始写时没写下面这条代码,然后再服务器端收不到数据。开始以为是发送不过去
//调试了一段时间才发现是没有把指针置为0,在使用byteBuffer时尤为需要注意的点
//使用时要把指针置为0,或者flip();
list.get(0).position(0);
channel.write(list.get(0));
list.remove(0);
} catch (IOException ex) {
Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
2. 对byte[]做转换。
① 将整型转换成byte[],并制定其站几位。在协议里面确定好位数,比如功能码占两个字节!
public static byte[] intToByteArray(long res, int length) {
byte[] byteArray = new byte[length];
for (int i = 0; i < byteArray.length; i++) {
byteArray[i] = (byte) ((res >> ((byteArray.length - i - 1) *
) &
0xff);
}
return byteArray;
}
② 将byte[]转换成整型
public static byte[] intToByteArray(long res, int length) {
byte[] byteArray = new byte[length];
for (int i = 0; i < byteArray.length; i++) {
byteArray[i] = (byte) ((res >> ((byteArray.length - i - 1) *
) &
0xff);
}
return byteArray;
}
等等;
4. 在做通讯协议是,有很多操作,读数据,写数据,处理数据,将传过来的包解包,将数组组包发送。
都需要一些列的处理。
①这做这些处理时可以引入缓存的概念。
e.g.
private static Map<Integer, List<ByteBuffer>> readcache = new HashMap<Integer,
List<ByteBuffer>>();
该处声明了一个Map用来存放ByteBuffer以及接受该Bytebuffer的通讯端的标志号。这么做的好处在于比
如一个client端接收到服务器端发送过来的包时。对该包的处理不必在client中处理。只需要把收到的厨
具存到缓存中。当服务器端连续发送大量数据过来也不会等待。然后再起一个线程专门用来对readcache
中的数据进行解包处理。这样就把这两个步骤分离开来。
②对于数据包,的解包及组包的操作。把包声明为一个类,讲包头,功能码,校验码,包尾等等都变成类
的字段。字段的类型根据具体的协议来定。在转换时的难题在于位数要确定。比如协议规定包头占2为。
所以在做byte[]前两位转换成包头。组包时如果把String类型的包头转换成byte[],如何让byte[]也占两
位。
③ 在做缓存时,通常把缓存都声明在一个类中,然后为缓存添加getter和setter方法。要注意两点,其
一是对缓存修改时必须记得synchronized。防止读缓存和写缓存时有冲突。 其二是当map<>中封装的为基
本类型时,当你用set方法,是不会set成功的。虽然也知道传引用这么回事。这次还是调试了很久才发现
。
e.g.
public static void setStatus(Integer siteNum, Boolean state)
{
Boolean sta = status.get(siteNum);
if (sta != null)
{
synchronized(sta)
{
sta = state;
}
}
else
{
status.put(siteNum, state);
}
}
//该缓存为记录客户端的状态,在线或不在线。但是当调用set时,是改不掉其状态的。对于这种,直
接//用put操作将其放入map中即可
④ 一般协议的各个部分的字节都是定义好了的,所以我们将其字节在一个文件中定义出来。
e.g.
public class FieldInfo {
//帧头
public static final int HEAD_LEN = 1;
//功能码
public static final int FUNCTION_CODE = 1;
//帧长度
public static final int FRAME_LEN = 2;
//流水号
public static final int MSG_ID = 4;
//站址
public static final int STATION_ADDR = 2;
//保留
public static final int LEAVE = 2;
//校验位
public static final int CHECK_SUM = 1;
//帧尾
public static final int TAIL_LEN = 1;
}
⑤ 判断客户端是否在线的方法。客户端启动一个线程,不停的往写缓存中写入心跳包,然后服务器端收
到心跳包时给个心跳回应包。
5.Timer 类可以实现定时刷新。Timer time = new Timer(1000,new class(implements actionLisener))
然后再实现了ActionListener的方法中调用repaint方法。
分享到:
相关推荐
MODBUS-RTU是一种广泛应用的工业通信协议,它基于串行通信,被广泛用于设备间的简单数据交换,尤其是在PLC(可编程逻辑控制器)和其他自动化设备之间。此压缩包文件"modbus-RTU.rar"包含的是一个针对MODBUS-RTU协议...
**Modbus RTU标准通讯协议详解** Modbus是一种广泛应用的串行通信协议,由Modicon公司(现为Schneider Electric)于1979年推出,主要用于工业设备间的通信。在Modbus协议中,Modbus RTU(Remote Terminal Unit)是...
本篇文章将深入探讨如何在C#中实现Modbus RTU通信,以及相关的库和编程技巧。 首先,让我们理解什么是Modbus RTU。Modbus是基于串行通信的一种简单、开放的协议,RTU(远程终端单元)模式是其工作方式之一,它通过...
《基于TMS320F28335的MODBUS-RTU从站程序详解》 在工业自动化领域,MODBUS通信协议因其简单、可靠而广泛应用。本篇将深入探讨如何利用TMS320F28335 DSP(数字信号处理器)实现MODBUS-RTU从站程序的设计与实现,旨在...
RTU终端(智能RTU终端)为远程测控终端,是SCADA系统的基本组成单元。唐山平升RTU终端(智能RTU终端)是安装在远程现场的电子设备,用来监视和测量安装在远程现场的传感器和设备,负责对现场信号、工业设备的监测和...
Modbus RTU(Remote Terminal Unit)是一种在串行通信中广泛使用的消息协议,属于OSI模型的第七层,即应用层。它是为了解决不同类型总线或网络上设备之间的客户机/服务器通信问题而设计的。Modbus协议自1979年被定义...
**MFC Modbus RTU简介** MFC (Microsoft Foundation Classes) 是微软开发的一种C++类库,用于构建Windows应用程序,它提供了丰富的用户界面组件和系统服务。而Modbus RTU(远程终端单元)是一种广泛应用于工业自动...
RTU设备(RTU模块、RTU终端)为远程测控终端,是SCADA系统的基本组成单元。唐山平升RTU设备(RTU模块、RTU终端)是基于GPRS、CDMA 、短消息、卫星等无线通信网络实现远程数据采集和传输的智能终端设备,可轻松实现物...
【华为路由器激活硬件RTU与业务License操作指南】 在华为路由器的管理中,激活硬件RTU(Right to Use)和业务License是确保设备功能全面启用的关键步骤。硬件RTU主要用于控制采用消费模型(CM,Consumption Model)...
RTU模块( 智能RTU模块、RTU通信模块)为远程测控终端,是SCADA系统的基本组成单元。唐山平升RTU模块( 智能RTU模块、RTU通信模块)是基于GPRS、CDMA 、短消息、卫星等通信网络实现远程数据采集和传输的智能终端设备...
**ModbusTCP转RTU详解** Modbus是一种广泛使用的工业通信协议,主要应用于PLC(可编程逻辑控制器)和其他自动化设备之间。它分为两种主要的传输模式:Modbus TCP(Transmission Control Protocol)和Modbus RTU...
标题中的“rtu_rtu通讯案例_modbusRTU_MODBUS-RTU_”指的是一个关于RTU(Remote Terminal Unit)通信的实例,其中涉及到的是Modbus RTU协议。Modbus RTU是Modbus协议的一种变体,适用于串行通信,尤其在工业自动化...
而Modbus RTU(Remote Terminal Unit)则是一种常用的数据通信协议,常用于工业自动化领域,它允许设备之间通过串行接口进行通信。 "qt5实现modbusrtu"意味着我们要在Qt5环境中构建一个能够与Modbus RTU协议兼容的...
### 莫迪康ModbusRTU:深入解析与应用 #### 一、莫迪康ModbusRTU概述 莫迪康ModbusRTU是一种基于Modbus协议的通信技术,广泛应用于工业自动化领域中的设备间通信。ModbusRTU协议采用串行通信接口,能够实现主机与...
在Linux环境中,MODBUS-RTU驱动程序是一个关键组件,用于实现MODBUS通信协议,这是一种广泛应用的工业设备间通信标准。MODBUS允许不同设备通过串行连接交换数据,如PLC(可编程逻辑控制器)、传感器、执行器等。在...
### ModBus RTU 协议详解 #### 一、ModBus RTU协议概述 ModBus RTU(Remote Terminal Unit)是一种广泛应用于工业自动化领域的通信协议,它基于串行通信链路上实现对各种智能设备的数据交换。ModBus RTU支持简单的...
MODBUS RTU是一种广泛应用于工业自动化领域的通信协议,它基于串行通信,允许不同设备之间进行数据交换。在这个名为"MODBUS_RTU_Master.zip"的压缩包中,包含了一个针对STM32F407微控制器实现的MODBUS RTU多主站源...
《Modbus RTU Master工具详解及其应用》 Modbus RTU Master V3.1 x64是一款专为工业通信设计的高效、小巧的测试工具,适用于Windows操作系统平台,且无须安装任何额外的运行库,是一款典型的绿色软件。它以其易用性...
Modbus RTU是一种广泛使用的工业通信协议,它允许设备之间进行数据交换,特别是在自动化系统中。这个资源包可能包含了在Java环境下实现Modbus RTU通信所需的工具和资料。以下是关于Modbus RTU以及如何在Java中实现它...