16,554
社区成员
发帖
与我相关
我的任务
分享
[code=java]package com.example.modbustcp;
import usertype.MODBUS_QUEUE_TYPE;
public class Modbus
{
public Modbus() {
}
static public void ReadCoilRegisters(MODBUS_QUEUE_TYPE ptcb)
{
short ByteCount;
MODBUS_QUEUE_TYPE tempQueue = new MODBUS_QUEUE_TYPE();
tempQueue.Data[0] = GlobalVar.TransactionIdent_H; //事务处理标识符高字节
tempQueue.Data[1] = GlobalVar.TransactionIdent_L; //事务处理标识符低字节
tempQueue.Data[2] = (byte) (GlobalVar.ProtocolIdent >> 0x08); //协议标识符H =0 表示MODBUS协议
tempQueue.Data[3] = (byte) (GlobalVar.ProtocolIdent & 0xFF); //协议标识符L =0 表示MODBUS协议
tempQueue.Data[4] = 0x00; //长度H(从本字节下一个到最后)
tempQueue.Data[5] = 0x06; //长度L(从本字节下一个到最后)
tempQueue.Data[6] = GlobalVar.UnitIdent; //单元标识符
//----------------------------------------------------------------------------------
tempQueue.Data[7] = 0x01; //功能码
tempQueue.Data[8] = (byte) (ptcb.StartAddr >> 0x08); //起始地址H
tempQueue.Data[9] = (byte) (ptcb.StartAddr & 0xFF); //起始地址L
tempQueue.Data[10] = (byte) (ptcb.RegisterAmount >> 0x08); //寄存器数量H
tempQueue.Data[11] = (byte) (ptcb.RegisterAmount & 0xFF); //寄存器数量L
//----------------------------------------------------------------------------------
tempQueue.Func = 0x01;
tempQueue.StartAddr = ptcb.StartAddr;
tempQueue.RegisterAmount = ptcb.RegisterAmount;
ByteCount = (short)(ptcb.RegisterAmount >> 3);
if ((ptcb.RegisterAmount & 0x07) != 0)
ByteCount++;
tempQueue.ByteCount = ByteCount;
tempQueue.SendCount = 12;
tempQueue.RepeatCount = 0x03;
GlobalVar.ModbusQueue.In_Queue(tempQueue);
}
static public void ReadDiscreteRegisters(MODBUS_QUEUE_TYPE ptcb)
{
short ByteCount;
MODBUS_QUEUE_TYPE tempQueue = new MODBUS_QUEUE_TYPE();
tempQueue.Data[0] = GlobalVar.TransactionIdent_H; //事务处理标识符高字节
tempQueue.Data[1] = GlobalVar.TransactionIdent_L; //事务处理标识符低字节
tempQueue.Data[2] = (byte) (GlobalVar.ProtocolIdent >> 0x08); //协议标识符H =0 表示MODBUS协议
tempQueue.Data[3] = (byte) (GlobalVar.ProtocolIdent & 0xFF); //协议标识符L =0 表示MODBUS协议
tempQueue.Data[4] = 0x00; //长度H(从本字节下一个到最后)
tempQueue.Data[5] = 0x06; //长度L(从本字节下一个到最后)
tempQueue.Data[6] = GlobalVar.UnitIdent; //单元标识符
//----------------------------------------------------------------------------------
tempQueue.Data[7] = 0x02; //功能码
tempQueue.Data[8] = (byte) (ptcb.StartAddr >> 0x08); //起始地址H
tempQueue.Data[9] = (byte) (ptcb.StartAddr & 0xFF); //起始地址L
tempQueue.Data[10] = (byte) (ptcb.RegisterAmount >> 0x08); //寄存器数量H
tempQueue.Data[11] = (byte) (ptcb.RegisterAmount & 0xFF); //寄存器数量L
//----------------------------------------------------------------------------------
tempQueue.Func = 0x02;
tempQueue.StartAddr = ptcb.StartAddr;
tempQueue.RegisterAmount = ptcb.RegisterAmount;
ByteCount = (short)(ptcb.RegisterAmount >> 3);
if ((ptcb.RegisterAmount & 0x07) != 0)
ByteCount++;
tempQueue.ByteCount = ByteCount;
tempQueue.SendCount = 12;
tempQueue.RepeatCount = 0x03;
GlobalVar.ModbusQueue.In_Queue(tempQueue);
}
//当读取125个寄存器时系统本刊崩溃,目前程序最大只能读取120个寄存器
static public void ReadInputRegisters(MODBUS_QUEUE_TYPE ptcb)
{
MODBUS_QUEUE_TYPE tempQueue = new MODBUS_QUEUE_TYPE();
tempQueue.Data[0] = GlobalVar.TransactionIdent_H; //事务处理标识符高字节
tempQueue.Data[1] = GlobalVar.TransactionIdent_L; //事务处理标识符低字节
tempQueue.Data[2] = (byte) (GlobalVar.ProtocolIdent >> 0x08); //协议标识符H =0 表示MODBUS协议
tempQueue.Data[3] = (byte) (GlobalVar.ProtocolIdent & 0xFF); //协议标识符L =0 表示MODBUS协议
tempQueue.Data[4] = 0x00; //长度H(从本字节下一个到最后)
tempQueue.Data[5] = 0x06; //长度L(从本字节下一个到最后)
tempQueue.Data[6] = GlobalVar.UnitIdent; //单元标识符
//----------------------------------------------------------------------------------
tempQueue.Data[7] = 0x04; //功能码
tempQueue.Data[8] = (byte) (ptcb.StartAddr >> 0x08); //起始地址H
tempQueue.Data[9] = (byte) (ptcb.StartAddr & 0xFF); //起始地址L
tempQueue.Data[10] = (byte) (ptcb.RegisterAmount >> 0x08); //寄存器数量H
tempQueue.Data[11] = (byte) (ptcb.RegisterAmount & 0xFF); //寄存器数量L
//----------------------------------------------------------------------------------
tempQueue.Func = 0x04;
tempQueue.StartAddr = ptcb.StartAddr;
tempQueue.RegisterAmount = ptcb.RegisterAmount;
tempQueue.ByteCount = (short)(ptcb.RegisterAmount << 0x01);
tempQueue.SendCount = 12;
tempQueue.RepeatCount = 0x03;
GlobalVar.ModbusQueue.In_Queue(tempQueue);
}
//当读取125个寄存器时系统本刊崩溃,目前程序最大只能读取120个寄存器
static public void ReadHoldingRegisters(MODBUS_QUEUE_TYPE ptcb)
{
MODBUS_QUEUE_TYPE tempQueue = new MODBUS_QUEUE_TYPE();
tempQueue.Data[0] = GlobalVar.TransactionIdent_H; //事务处理标识符高字节
tempQueue.Data[1] = GlobalVar.TransactionIdent_L; //事务处理标识符低字节
tempQueue.Data[2] = (byte) (GlobalVar.ProtocolIdent >> 0x08); //协议标识符H =0 表示MODBUS协议
tempQueue.Data[3] = (byte) (GlobalVar.ProtocolIdent & 0xFF); //协议标识符L =0 表示MODBUS协议
tempQueue.Data[4] = 0x00; //长度H(从本字节下一个到最后)
tempQueue.Data[5] = 0x06; //长度L(从本字节下一个到最后)
tempQueue.Data[6] = GlobalVar.UnitIdent; //单元标识符
//----------------------------------------------------------------------------------
tempQueue.Data[7] = 0x03; //功能码
tempQueue.Data[8] = (byte) (ptcb.StartAddr >> 0x08); //起始地址H
tempQueue.Data[9] = (byte) (ptcb.StartAddr & 0xFF); //起始地址L
tempQueue.Data[10] = (byte) (ptcb.RegisterAmount >> 0x08); //寄存器数量H
tempQueue.Data[11] = (byte) (ptcb.RegisterAmount & 0xFF); //寄存器数量L
//----------------------------------------------------------------------------------
tempQueue.Func = 0x03;
tempQueue.StartAddr = ptcb.StartAddr;
tempQueue.RegisterAmount = ptcb.RegisterAmount;
tempQueue.ByteCount = (short)(ptcb.RegisterAmount << 0x01);;
tempQueue.SendCount = 12;
tempQueue.RepeatCount = 0x03;
GlobalVar.ModbusQueue.In_Queue(tempQueue);
}
static public void ForceSingleCoil(MODBUS_QUEUE_TYPE ptcb , char On_Off)
{
MODBUS_QUEUE_TYPE tempQueue = new MODBUS_QUEUE_TYPE();
tempQueue.Data[0] = GlobalVar.TransactionIdent_H; //事务处理标识符高字节
tempQueue.Data[1] = GlobalVar.TransactionIdent_L; //事务处理标识符低字节
tempQueue.Data[2] = (byte) (GlobalVar.ProtocolIdent >> 0x08); //协议标识符H =0 表示MODBUS协议
tempQueue.Data[3] = (byte) (GlobalVar.ProtocolIdent & 0xFF); //协议标识符L =0 表示MODBUS协议
tempQueue.Data[4] = 0x00; //长度H(从本字节下一个到最后)
tempQueue.Data[5] = 0x06; //长度L(从本字节下一个到最后)
tempQueue.Data[6] = GlobalVar.UnitIdent; //单元标识符
// ----------------------------------------------------------------------------------
tempQueue.Data[7] = 0x05; //功能码
tempQueue.Data[8] = (byte) (ptcb.StartAddr >> 0x08); //起始地址H
tempQueue.Data[9] = (byte) (ptcb.StartAddr & 0xFF); //起始地址L
if (On_Off == 0xFF00)
tempQueue.Data[10] = (byte) 0xFF;
else
tempQueue.Data[10] = 0x00;
tempQueue.Data[11] = 0x00;
//----------------------------------------------------------------------------------
tempQueue.Func = 0x05;
tempQueue.StartAddr = ptcb.StartAddr;
tempQueue.RegisterAmount = ptcb.RegisterAmount;
tempQueue.ByteCount = 2;
tempQueue.SendCount = 12;
tempQueue.RepeatCount = 0x03;
GlobalVar.ModbusQueue.In_Queue(tempQueue);
}
static public void PresetSingleHoldingRegister(MODBUS_QUEUE_TYPE ptcb ,char Value)
{
MODBUS_QUEUE_TYPE tempQueue = new MODBUS_QUEUE_TYPE();
tempQueue.Data[0] = GlobalVar.TransactionIdent_H; //事务处理标识符高字节
tempQueue.Data[1] = GlobalVar.TransactionIdent_L; //事务处理标识符低字节
tempQueue.Data[2] = (byte) (GlobalVar.ProtocolIdent >> 0x08); //协议标识符H =0 表示MODBUS协议
tempQueue.Data[3] = (byte) (GlobalVar.ProtocolIdent & 0xFF); //协议标识符L =0 表示MODBUS协议
tempQueue.Data[4] = 0x00; //长度H(从本字节下一个到最后)
tempQueue.Data[5] = 0x06; //长度L(从本字节下一个到最后)
tempQueue.Data[6] = GlobalVar.UnitIdent; //单元标识符
//----------------------------------------------------------------------------------
tempQueue.Data[7] = 0x06; //功能码
tempQueue.Data[8] = (byte) (ptcb.StartAddr >> 0x08); //起始地址H
tempQueue.Data[9] = (byte) (ptcb.StartAddr & 0xFF); //起始地址L
tempQueue.Data[10] = (byte) (Value >> 0x08); //寄存器值H
tempQueue.Data[11] = (byte) (Value & 0xFF); //寄存器值L
//----------------------------------------------------------------------------------
tempQueue.Func = 0x06;
tempQueue.StartAddr = ptcb.StartAddr;
tempQueue.RegisterAmount = ptcb.RegisterAmount;
tempQueue.ByteCount = 2;
tempQueue.SendCount = 12;
tempQueue.RepeatCount = 0x03;
GlobalVar.ModbusQueue.In_Queue(tempQueue);
}
[/code] 通讯部分更改,内容协议不变,建议使用NModbus等第三方封装好的Modbus协议库.具体数据解析及处理部分移植下就好了.