当前位置:编程学习 > JAVA >>

java modbus串口通信问题,主站用的是java-modbus包编写的程序,从站用的是modbus simulator模拟器

现在有一个串口通信的任务,主要实现的目标是:写一个java程序,通过串口读取一个PLC设备的状态信息,读取到了之后我这边的java程序修改一些这些值,然后发送给另外一个设备(可能是一台计算机)




我要写的java程序是扮演一个主站的角色,PLC设备是从站。我现在主要的问题是不知道那个模拟器怎么用,上面很多10001, 10002....这些是什么东西?它的默认值是0,也就是关闭,双击可以改为1,开启,我想在主站中读取它上面这些10001,10002的值,但是主站这边返回的全是0,怎么回事?


从站modbus simulator软件如图所示



红框中的值被改成了1,也就是开启



java编写的主站的初始化方法:


//类中的主要成员变量

private ModbusFactory factory = new ModbusFactory();

private ModbusMaster master = null;

private DecimalFormat format = new DecimalFormat("0.0");

private DecimalFormat format3 = new DecimalFormat("0.000");

private Random random = new Random();

private String[] cid =

{ "101272124", "388477462", "388477474", "388477478", "388477510", "388477518", "388477538", "388477542", "3322208", "388477458", "388477490", "388477494", "388477506",

"388477522", "395520057", "199222040" };

private String getCid()

{

int index = Math.abs(random.nextInt()) % (cid.length);

return cid[index];

}




// 初始化方法

public void init()

{

SerialParameters params = new SerialParameters();

try

{

// 设定MODBUS 通讯的串行口

params.setCommPortId("COM2");

// 设定成无奇偶校验

params.setParity(2);

// 设定成数据位是8 位

params.setDataBits(8);

// 设定为1 个停止位

params.setStopBits(1);

// 串行口上的波特率

params.setBaudRate(9600);

master = factory.createRtuMaster(params);

//master = factory.createAsciiMaster(params);

master.setRetries(0);

master.init();

}

catch (Exception e)

{

e.printStackTrace();

}

}







主站发送请求和接收从站的返回值主要代码如下所示:

public void readElectValue(int slaveId, int start, int len)

{

ReadHoldingRegistersRequest request = null;

ReadHoldingRegistersResponse response = null;

try

{

request = new ReadHoldingRegistersRequest(slaveId, start, len);

response = (ReadHoldingRegistersResponse) master.send(request);

if (response.isException())

{

System.out.println("ERROR========================START");

System.out.println(response.getExceptionCode());

System.out.println(response.getExceptionMessage());

System.out.println("ERROR========================END");

}

short[] value = response.getShortData();

//byte[] data = response.getData();

//boolean[] bool = response.getBooleanData();

for(int i = 0; i < value.length; i++)

{

System.out.println("getShortDate[" + i + "]:" + value[i]);    // 这里输出的全是0

}

....

}

--------------------编程问答-------------------- 得到数据为0也许是你读取的地址不对,没有把数据读出来,我以前也遇见过这样的问题, --------------------编程问答-------------------- 你确认连接上了么?
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,