空调远程控制系统
使用的是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,望高人指点,不胜感激