`
AAries
  • 浏览: 39582 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

RTU

阅读更多
最近项目分给我一个任务模拟写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.rar_MODBUS-RTU_Modbus RTU c#_modbus C库_rtu_rtu protoc

    MODBUS-RTU是一种广泛应用的工业通信协议,它基于串行通信,被广泛用于设备间的简单数据交换,尤其是在PLC(可编程逻辑控制器)和其他自动化设备之间。此压缩包文件"modbus-RTU.rar"包含的是一个针对MODBUS-RTU协议...

    Modbus+RTU+标准通讯协议格式.rar_modbus_modbus RTU_rtu

    **Modbus RTU标准通讯协议详解** Modbus是一种广泛应用的串行通信协议,由Modicon公司(现为Schneider Electric)于1979年推出,主要用于工业设备间的通信。在Modbus协议中,Modbus RTU(Remote Terminal Unit)是...

    C#modbus rtu绝对好用,绝对能用.rar_C# ModbusRtu 库_C#Modbus通信_C#modbusrtu_

    本篇文章将深入探讨如何在C#中实现Modbus RTU通信,以及相关的库和编程技巧。 首先,让我们理解什么是Modbus RTU。Modbus是基于串行通信的一种简单、开放的协议,RTU(远程终端单元)模式是其工作方式之一,它通过...

    基于TMS320F28335的MODBUS-RTU从站程序.rar_MODBUS-RTU_dsp28335_modbus RTU

    《基于TMS320F28335的MODBUS-RTU从站程序详解》 在工业自动化领域,MODBUS通信协议因其简单、可靠而广泛应用。本篇将深入探讨如何利用TMS320F28335 DSP(数字信号处理器)实现MODBUS-RTU从站程序的设计与实现,旨在...

    RTU、RTU终端

    RTU终端(智能RTU终端)为远程测控终端,是SCADA系统的基本组成单元。唐山平升RTU终端(智能RTU终端)是安装在远程现场的电子设备,用来监视和测量安装在远程现场的传感器和设备,负责对现场信号、工业设备的监测和...

    MODBUS RTU使用详解

    Modbus RTU(Remote Terminal Unit)是一种在串行通信中广泛使用的消息协议,属于OSI模型的第七层,即应用层。它是为了解决不同类型总线或网络上设备之间的客户机/服务器通信问题而设计的。Modbus协议自1979年被定义...

    MFC 简单Modbus RTU.zip_MFC Modbus_MFC modbus RTU_MFCmodbus_mfc vs2

    **MFC Modbus RTU简介** MFC (Microsoft Foundation Classes) 是微软开发的一种C++类库,用于构建Windows应用程序,它提供了丰富的用户界面组件和系统服务。而Modbus RTU(远程终端单元)是一种广泛应用于工业自动...

    RTU设备、RTU模块、RTU终端、RTU厂家

    RTU设备(RTU模块、RTU终端)为远程测控终端,是SCADA系统的基本组成单元。唐山平升RTU设备(RTU模块、RTU终端)是基于GPRS、CDMA 、短消息、卫星等无线通信网络实现远程数据采集和传输的智能终端设备,可轻松实现物...

    华为路由器 激活硬件 RTU 与业务 License 操作指导

    【华为路由器激活硬件RTU与业务License操作指南】 在华为路由器的管理中,激活硬件RTU(Right to Use)和业务License是确保设备功能全面启用的关键步骤。硬件RTU主要用于控制采用消费模型(CM,Consumption Model)...

    RTU模块、 智能RTU模块、RTU通信模块

    RTU模块( 智能RTU模块、RTU通信模块)为远程测控终端,是SCADA系统的基本组成单元。唐山平升RTU模块( 智能RTU模块、RTU通信模块)是基于GPRS、CDMA 、短消息、卫星等通信网络实现远程数据采集和传输的智能终端设备...

    ModbusTCP转RTU

    **ModbusTCP转RTU详解** Modbus是一种广泛使用的工业通信协议,主要应用于PLC(可编程逻辑控制器)和其他自动化设备之间。它分为两种主要的传输模式:Modbus TCP(Transmission Control Protocol)和Modbus RTU...

    rtu_rtu通讯案例_modbusRTU_MODBUS-RTU_

    标题中的“rtu_rtu通讯案例_modbusRTU_MODBUS-RTU_”指的是一个关于RTU(Remote Terminal Unit)通信的实例,其中涉及到的是Modbus RTU协议。Modbus RTU是Modbus协议的一种变体,适用于串行通信,尤其在工业自动化...

    qt5实现modbusrtu

    而Modbus RTU(Remote Terminal Unit)则是一种常用的数据通信协议,常用于工业自动化领域,它允许设备之间通过串行接口进行通信。 "qt5实现modbusrtu"意味着我们要在Qt5环境中构建一个能够与Modbus RTU协议兼容的...

    莫迪康ModbusRTU

    ### 莫迪康ModbusRTU:深入解析与应用 #### 一、莫迪康ModbusRTU概述 莫迪康ModbusRTU是一种基于Modbus协议的通信技术,广泛应用于工业自动化领域中的设备间通信。ModbusRTU协议采用串行通信接口,能够实现主机与...

    LINUX下的MODBUS-RTU驱动程序

    在Linux环境中,MODBUS-RTU驱动程序是一个关键组件,用于实现MODBUS通信协议,这是一种广泛应用的工业设备间通信标准。MODBUS允许不同设备通过串行连接交换数据,如PLC(可编程逻辑控制器)、传感器、执行器等。在...

    ModBus RTU 协议详解

    ### ModBus RTU 协议详解 #### 一、ModBus RTU协议概述 ModBus RTU(Remote Terminal Unit)是一种广泛应用于工业自动化领域的通信协议,它基于串行通信链路上实现对各种智能设备的数据交换。ModBus RTU支持简单的...

    MODBUS_RTU_Master.zip(STM32F407单片机上开发的MODBUS RTU 多主站源程序)

    MODBUS RTU是一种广泛应用于工业自动化领域的通信协议,它基于串行通信,允许不同设备之间进行数据交换。在这个名为"MODBUS_RTU_Master.zip"的压缩包中,包含了一个针对STM32F407微控制器实现的MODBUS RTU多主站源...

    ModbusRTU_Master V3.1 x64.rar

    《Modbus RTU Master工具详解及其应用》 Modbus RTU Master V3.1 x64是一款专为工业通信设计的高效、小巧的测试工具,适用于Windows操作系统平台,且无须安装任何额外的运行库,是一款典型的绿色软件。它以其易用性...

    modbus-rtu解析Java相关所需资源

    Modbus RTU是一种广泛使用的工业通信协议,它允许设备之间进行数据交换,特别是在自动化系统中。这个资源包可能包含了在Java环境下实现Modbus RTU通信所需的工具和资料。以下是关于Modbus RTU以及如何在Java中实现它...

Global site tag (gtag.js) - Google Analytics