工控编程吧
标题:
采用PLC作为服务器保存数值,然后用jamodmodbus客户端写代码从PC连接到PLC,读取PL...
[打印本页]
作者:
baikhgmv
时间:
2016-3-21 12:15
标题:
采用PLC作为服务器保存数值,然后用jamodmodbus客户端写代码从PC连接到PLC,读取PL...
采用PLC作为服务器保存数值,然后用jamodmodbus客户端写代码从PC连接到PLC,读取PLC寄存器值。值始终为零
我用PLC作为服务器和写代码读取寄存器值(DB10。data files)如图片贴在下面。我用jamodmodbus客户端写代码从PC连接到PLC寄存器(DB10。data files)。
结果是:我可以连接到PLC的成功,将请求发送到PLC的输出响应值,但我从寄存器(DB10。data files)PLC总是零(00)。我怎样才能解决这个问题,请告诉我使用代码从寄存器读取值(DB10。data files)和改变他们的小数?
这是我个人电脑上的代码:
package testmodbus;
import java.lang.*;
import java.net.InetAddress;
import java.net.SocketTimeoutException;
import net.wimpi.modbus.Modbus;
import net.wimpi.modbus.ModbusSlaveException;
import net.wimpi.modbus.io.ModbusTCPTransaction;
import net.wimpi.modbus.msg.WriteCoilRequest;
import net.wimpi.modbus.msg.ReadInputRegistersRequest;
import net.wimpi.modbus.msg.ReadInputRegistersResponse;
import net.wimpi.modbus.net.TCPMasterConnection;
public class TestModbus {
public static void main(String[] args) throws ModbusSlaveException, SocketTimeoutException{
// TODO code application logic here
try {
/* The important instances of the class */
TCPMasterConnection con = null; // the connection
ModbusTCPTransaction trans = null; // the transaction
ReadInputRegistersRequest rreq = null; // the read request
ReadInputRegistersResponse rres = null; // the read response
WriteCoilRequest req = null; // the write request
int ref = 40000; //the reference; offset where to start reading from
int count =0;
int repeat = 2;
/* Variables for storing the parameters */
InetAddress addr = null; // the slave's address
int port = Modbus.DEFAULT_PORT; // DEFAULT_PORT = 502.
// 1. Setup ?":>the parameters
addr = InetAddress.getByName("192.168.0.1"); // ** The address of PLC
// 2. Open the connection
con = new TCPMasterConnection(addr);
con.setPort(port);
con.connect();
System.out.println("--- Message: Line:36 success --- ");
System.out.println("Connect to PLC sucessfull!!");
// ~~~~~~~~~~~~~~~~~~~~ The faulty Read Request ~~~~~~~~~~~~~~~~~~~~
// // 3r. Prepare the READ request
rreq = new ReadInputRegistersRequest(ref, count);
System.out.println("The reqquest values =" + rreq.getHexMessage());
System.out.println("--- Message: Line:42 success --- ");
//// // 4r. Prepare the READ transaction
trans = new ModbusTCPTransaction(con);
trans.setRequest(rreq);
/ System.out.println("--- Message: Line:46 success --- ");
//// // 5r. Execute the READ transaction
int k = 0;
do {
trans.execute();
rres = (ReadInputRegistersResponse) trans.getResponse();
System.out.println("The reqquest values =" + rreq.getHexMessage());
System.out.println("getHexMessage of resspond = "+ rres.getHexMessage());
k++;
}while (k<repeat);
// 6. Close the connection
con.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
这是我从控制台得到的输出 代码:
run:
--- Message: Line:36 success ---
Connect to PLC sucessfull!!
The reqquest values =00 00 00 00 00 06 00 04 9c 40 00 00
--- Message: Line:42 success ---
--- Message: Line:46 success ---
The reqquest values =00 01 00 00 00 06 00 04 9c 40 00 00
getHexMessage of resspond = 00 01 00 00 00 03 00 04 00
The reqquest values =00 02 00 00 00 06 00 04 9c 40 00 00
getHexMessage of resspond = 00 02 00 00 00 03 00 04 00 // always get 00 values form PLC with whatever address I try to read from PLC.
BUILD SUCCESSFUL (total time: 0 seconds)
回答一:如果客户端/主请求数据来自于保持寄存器,则在请求消息和响应消息中出现功能代码03。
如果你的例子是十六进制查询或响应
的reqquest值= 00 00 00 00 00 06 00 04 40 00 00 9C
信息:路线:42成功---
信息:路线:46成功---
的reqquest值= 00 01 00 00 00 06 00 04 40 00 00 9C
对resspond = 00 01 00 00 00 03 00 04 00 gethexmessage
的reqquest值= 00 02 00 00 00 06 00 04 40 00 00 9C
然后在任何消息中我都没有看到03个函数代码。
您确定在保持寄存器中的数据吗?
你发送(fc03)设置保持寄存器?
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4