`
AAries
  • 浏览: 39003 次
  • 性别: 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方法。
分享到:
评论

相关推荐

    RTU、RTU终端

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

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

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

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

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

    基于LabVIEW的Modbus RTU 通信协议的实现

    基于LabVIEW的Modbus RTU 通信协议的实现 摘要: 在简单介绍Modbus RTU 通信协议技术特点的基础上,详细地阐述了在LabVIEW 7 Express 软件平台上基于Modbus RTU 通信协议的上位计算机与CW2 系列智能型万能式断路器主从...

    智能RTU、智能RTU终端

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

    MODBUS-RTU协议多机通信51单片机实现主机从机

    MODBUS-RTU协议多机通信 史上最容易看懂的代码! 程序代码包含4个独立程序 1台主机:读取从机湿度温度控制LED和继电器 3台从机:从机1采集温度,从机2采集湿度,从机3控制继电器和LED流水花样 主控89C52,显示液晶...

    基于stm32单片机实现modbus-rtu 通讯规约源码-有注释.zip

    基于stm32单片机实现modbus-rtu 通讯规约源码-有注释 通讯数据的类型及格式: 信息传输为异步方式,并以字节为单位。每个字节由8位二进制数组成。主机和从机之间传递的通讯信息是10位的字格式: 字格式(串行数据) ...

    ModbusRTU.lib

    BECKHOFF TWINCAT2 的 MODBUS RTU库文件;BECKHOFF TWINCAT2 的 MODBUS RTU库文件;BECKHOFF TWINCAT2 的 MODBUS RTU库文件

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

    基于TMS320F28335的MODBUS-RTU从站程序

    MODBUS-RTU协议主机和从机代码STM32单片机F103实现

    MODBUS-RTU协议主机和从机代码STM32 含功能码03 05 06 10 包含4个程序代码,主机和从机(代码易懂) 2个主机和从机(stm32f103vet6)2个主机和从机(stm32f103C8T6) 基于温度传感器DS18B20的MODBUS-RTU从机 主机...

    工业级RTU、测控终端RTU

    GPRS RTU具备数据/图像采集、现场设备控制、监测数据存储、无线远程通信、智能分析预警等功能,唐山平升GPRS RTU可轻松实现物物相联或人机互动,并具备数据存储、对比、分析和处理功能,是组成成套系统的现场核心...

    RTU、RTU设备、RTU模块、RTU终端、mudbus rtu

    RTU、RTU设备、RTU模块、RTU终端、mudbus rtu通过了国家水利部多项检测,具备仪表数据、设备状态的采集传输,远程控制、刷卡管理、用水控制等多项功能。唐山平升RTU、RTU设备、RTU模块、RTU终端、mudbus rtu低功耗...

    Modbus从站源码_MODBUS-RTU从_modbusRTU_MODBUS_RTU从站源码_modbus源码_51单片机_源

    MODBUS -RTU协议的,用C51实现的源码

    Modbus RTU CRC校验详细步骤CRC值怎么计算

    RTU 模式采用CRC(Cyclical Redundancy Check)侦误值。 CRC 侦误值计算以下列步骤说明: 步骤一:载入一个内容为 FFFFH 之16-bits 寄存器,称之为『CRC』寄存器。 步骤二:将指令信息的第一个位组与16-bits CRC ...

    C# ModBus通信读写操作,ModBus Rtu串口通信,ModBus Tcp通信,全开源可使用

    C#对三菱和西门子,欧姆龙等支持Modbus的服务器进行读写,不需要...3)支持ModBusRtu串口通信读写操作 4)支持ModBusAscii串口通信读写操作 5)支持ModbusRtuOverTcp通信读写操作 6)请放心下载,多个项目已经在使用;

    无线RTU GPRS远程测控终端

    无线RTU采用数据采集、传输一体化设计,可通过GPRS或者433MHz实现数据无线通讯,微功耗设计,无线RTU内置高性能锂电池,电池供电寿命长,IP68防护等级,防水、防潮、防浸泡,DATA86无线RTU特别适用于不具备供电条件...

    莫迪康ModbusRTU

    本驱动构件用于MCGS软件通过ModbusRTU协议读写Modicon PLC设备的各种寄存器的数据; 同时也可用于对支持ModbusRTU标准协议的各类PLC、仪表、控制器数据的读写。

    简易modbus RTU协议

    1、本文件是建议的modbusRTU主机 和从机程序 2、开发平台采样STM32F103单片机 3、从机采样串口1接口,接收为串口完成中断+DMA,发送为DMA+发送完成中断 3、主机采样串口3接口,接收为串口完成中断+DMA,发送为DMA+...

    物联网RTU、RTU设备、RTU、无线RTU

    物联网RTU具备数据/图像采集、现场设备控制、监测数据存储、无线远程通信、智能分析预警等功能,唐山平升物联网RTU可轻松实现物物相联或人机互动,并具备数据存储、对比、分析和处理功能,是组成成套系统的现场核心...

    MODBUS-RTU多机通信含4个单独程序1台主机3台从机基于89C52

    MODBUS-RTU协议多机通信提供解答 史上最容易看懂的代码 程序代码包含4个独立程序 1台主机:读取从机湿度温度控制LED和继电器 3台从机:从机1采集温度,从机2采集湿度,从机3控制继电器和LED流水花样 主控89C52,显示...

Global site tag (gtag.js) - Google Analytics