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