2 eoowill eoowill 于 2014.12.02 20:07 提问

Modbus RTU协议TCP通信代码

空调远程控制系统
使用的是modbus4j,不成功,初次使用modbus设备

协议解析
一、读取设备状态
发送:
设备地址 功能号 起始寄存器 寄存器字节个数 CRC校验
1字节 01H 0x00 0x00 0x00 0x01 MSB LSB
返回:
设备地址 功能号 起始寄存器 数据字节个数 设备状态 CRC校验
1字节 01H 0x00 0x00 0x00 0x01 9字节 MSB LSB

测试指令:
发送:01 01 00 00 00 09 MSB LSB
返回:01 01 00 00 00 09 11 00 02 1A 02 01 00 00 01 MSB LSB
其中:11-温度17度;00-保留;02 1A 02空调状态为制冷26度(详见空调码表);01 00-输入1闭合,输入2断开;00 01-输出1断开,输出2闭合


/**
     * 批量写数据到保持寄存器
     * 
     * @param master
     *            主站
     * @param slaveId
     *            从站地址
     * @param start
     *            起始地址的偏移量
     * @param values
     *            待写数据
     */
    public static void writeRegistersTest(ModbusMaster master, int slaveId,
            int start, short[] values) {
        try {
            WriteRegistersRequest request = new WriteRegistersRequest(slaveId,
                    start, values);
            WriteRegistersResponse response = (WriteRegistersResponse) master
                    .send(request);

            if (response.isException())
                System.out.println("Exception response: message="
                        + response.getExceptionMessage());
            else
                System.out.println("Success");
        } catch (ModbusTransportException e) {
            e.printStackTrace();
        }
    } 
 public static void main(String[] args) throws Exception {
        String ip = "10.1.8.222";
        int port = 100;
        ModbusFactory modbusFactory = new ModbusFactory(); // 设备ModbusTCP的Ip与端口,如果不设定端口则默认为502
        IpParameters params = new IpParameters();
        params.setHost(ip);
        if (502 != port) {
            params.setPort(port);
        }// 设置端口,默认502
        ModbusMaster tcpMaster = null;
        tcpMaster = modbusFactory.createTcpMaster(params, true);
        try {
            tcpMaster.init();
            writeRegistersTest(tcpMaster, 1, 0, new short[] { 0x01, 0x00, 0x00,
                    0x00, 0x09 });
        } finally {
            tcpMaster.destroy();
        }
    }

我QQ:782007828,望高人指点,不胜感激

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Modbus协议分析——TCP/RTU
TCP和RTU协议非常类似,只要把RTU协议的两个字节的校验码去掉,然后在RTU协议的开始加上5个0和一个6并通过TCP/IP网络协议发送出去即可   MBAP Header长度共7个字节,分别为Transaction identifier(事务标识符),Protocol identifier(协议标识符),Length(长度),  Unitidentifier(单元标识符)组成,具体
嵌入式系统之Modbus TCP to Modbus Rtu协议转换器开发
在做隧道广告项目的时候,用户提出一个新的需求:要求在指定的时段播放指定的节目。在利用现有条件下,经过充分分析,决定在隧道里安装一个西门子200 PLC,这样除建国门段的隧道系统外,其它现场直接用摩莎公司的NProt模块(TCP 转 485)就可以使隧道外的PC机直接访问到PLC,这个没有什么问题。对建国门段的隧道系统该怎么办?它目前采用的是成都英创公司的嵌入式模块NetBoxII(相当于一个386
基于vb.net的modbus上位机通信协议代码(RTU模式)
用vb.net写的modbus通信上位机小程序,可以实现读,写寄存器和线圈的功能。
Modbus、Modbus TCP、Modbus RTU和Modbus ASCII的区别
Modbus协议是OSI模型的第七层的应用层通讯协议,定义了不同类型设备间交换信息方式,以及信息的格式。 Modbus的工作方式是请求/应答,每次通讯都是主站先发送指令,可以是广播,或是向特定从站的单播,从站响应指令,并按要求应答,或者报告异常。当主站不发送请求时,从站不会自己发出数据,从站和从站之间不能直接通讯。 Modbus协议的报文(或帧)的基本格式是: 表头 + 功能码
DSP做的modbus rtu 主从站协议
DSP做的modbus rtu 主从站协议 2012-05-03 7:36 modbus RTU 协议:先后做1,3,15,16四个命令码,有主从站协议解析。  原文链接:http://blog.21ic.com/user1/3338/archives/2008/47236.html //-----------------------------------------
modbus tcp/rtu 基于C#的源码实现(老外的源码)
ModBus-Modbus是由Modicon(现为施耐德电气公司的一个品牌)在1979年发明的,是全球第一个真正用于工业现场的总线协议。ModBus网络是一个工业通信系统,由带智能终端的可...
【C++】Modbus通讯
MODBUS_SERVER.h MODBUS_SERVER.cpp MODBUS_SHARE.h MODBUS_SHARE.cpp PORT.h PORT.cpp 两个VC++ Modbus通信例子源代码.rar modbus 协议编程 C++ MODBUS_SERVER.h //Download by http://www.NewXing
ModbusRTU协议的Java Socket
昨天郭柯发过来一个WinTcpS7_1K.dll文件,在VB代码里跑并发数据到Modbus Slave,发现当Modbus Slave选择用“Modbus RTU over TCP/IP”连接时有数据传输过来,因此可以确定VB代码使用该DLL跟下位机进行通信时用的是ModbusRTU协议。 因此我就去模拟了直接用socket跟Modbus Slave进行ModbusRTU的通信,先给出Modbu
PC和单片机通过MODBUS RTU通信
最近研究了一下MODBUS通信,在STC12C5A60S2单片机上实现了MODBUS协议的部分功能,方便上位机从单片机系统上获取数据,比如由单片机获取的温度、湿度、或者控制信号的状态等。有了MODBUS协议后,上位机的开发就很方便了,可以使用C#等高级语言通过串口通信,或者使用组态王直接通过串口通信而不需要写代码,这些都归功于MODBUS协议的开放性,很多的组态软件都能提供对他的支持。甚至通过PL
VB6基于Windows API的Modbus RTU/ASCII/TCP的主站实现代码
分三模块 modSerialPort.bas 串口操作模块 modTCPClient.bas TCP操作模块 modModbusMaster.bas Modbus主站模块 实现代码例举如下 '打开 hModbus=ModbusOpen("Com1",ModbusRTU) '或者 hModbus=ModbusOpen("192.168.1.2:502",ModbusTCP) '===