Java实现Modbus/TCP客户端与modsim通信
目錄
Modbus/TCP簡介
使用Java GUI實現的過程
程序實現演示
modsim下載地址:
官網http://www.win-tech.com/html/demos.htm百度網盤(提取碼:0x18)http://xn--https-bl8js66z7n7i//pan.baidu.com/s/1W0gS5kOm-X3Fdy7iYQg0cg%20%20%E6%8F%90%E5%8F%96%E7%A0%81%EF%BC%9A
Modbus/TCP簡介
????????Modbus/TCP是Modbus的TCP網絡協議,TCP網絡端口號為502。Modbus/TCP在原有ModBus協議前增加了6個字節的協議頭,同時取消了Modbus協議的CRC16校驗和。其幀格式如下?
| 事務標識符 | 協議標識符 | Modbus信文長度 | 從站地址 | 功能碼 | 數據 |
| 2字節 | 2字節 | 2字節 | 1字節 | 1字節 | 0-248字節 |
使用Java GUI實現的過程
? ? ? ? 這里使用JLibMosbus(JLibModbus下載地址)實現,JLibModbus是Modbus的一個實現,該庫包含了ModBus/TCP協議的接口和類等,編寫通信程序時可以直接調用。另外該庫還封裝了流行的通信庫(如jSerialComm、RXTXcomm等),編寫Modbus串口通信(RTU)時也可使用該庫。
? ? ? ? 編寫Modbus/TCP通信程序的基本步驟如下:(1)設置TCP參數(使用TcpParameters),可以是本機(127.0.0.1),也可以時遠端機,將參數配置為遠端機的IP即可;(2)設置TCP端口號為默認端口號(502);(3)創建主機,即Modbus協議中提到的主站,與從站實現通信;(4)建立連接,進行數據的讀寫。
GUI實現
? ? ? ? 使用swing組件(JButton,JLabel,JTextFiled)來創建界面,創建好的界面如下圖:
?實現部分代碼:
//按鈕JButton[] btn = new JButton[4];btn[0] = new JButton("連接");btn[1] = new JButton("斷開");btn[2] = new JButton("采集數據");btn[3] = new JButton("更改數據");btn[0].setBounds(150, 30, 100, 30);btn[1].setBounds(350, 30, 100, 30);btn[2].setBounds(130, 190, 120, 30);btn[3].setBounds(130, 300, 120, 30);//靜態標簽JLabel[] jl = new JLabel[6];jl[0] = new JLabel("寄存器地址:");jl[0].setBounds(100, 145, 100, 30);jl[1] = new JLabel("更改寄存器的地址:");jl[1].setBounds(50, 255, 160, 30);jl[2] = new JLabel("采集到的數據:");jl[2].setBounds(270, 190, 120, 30);jl[3] = new JLabel("更改后的值為:");jl[3].setBounds(270, 300, 120, 30);jl[4] = new JLabel("連接狀態:");jl[4].setBounds(200, 100, 80, 30);jl[5] = new JLabel("未連接");jl[5].setForeground(Color.RED);Font f = new Font("宋體",Font.ITALIC,16);jl[5].setFont(f);jl[5].setBounds(280, 100, 100, 30);//編輯框JTextField[] jtf = new JTextField[4];jtf[0] = new JTextField("**");jtf[1] = new JTextField("**");jtf[2] = new JTextField("**");jtf[3] = new JTextField("**");jtf[0].setBounds(200, 150, 80, 20);//寄存器地址jtf[1].setBounds(390, 195, 80, 20);//采集到的數據jtf[2].setBounds(200, 260, 80, 20);//更改寄存器的地址jtf[3].setBounds(390, 305, 80, 20);//更改后的值JFrame jf = new JFrame();jf.setTitle("ModbusTCP_Test");jf.setLocation(200, 100);jf.setSize(600, 400);jf.getContentPane().setBackground(Color.PINK);jf.setLayout(null);jf.setVisible(true);jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);Font f1 = new Font("宋體",Font.BOLD,16);for (JButton jButton : btn) {jf.add(jButton);jButton.setFont(f1);}for (JTextField jTextField : jtf) {jf.add(jTextField);jTextField.setFont(f1);}for (int i=0;i< jl.length;i++) {jf.add(jl[i]);if (i!=5){jl[i].setFont(f1);}}通信部分實現
? ? ? ? 該部分主要就是給各個按鈕添加監聽事件(這里使用lambda表達式),當按鈕點擊時,通過一定的邏輯原理對modSim進行數據的讀寫操作。
代碼實現:
//設置TCP參數TcpParameters tcpParameters = new TcpParameters();InetAddress ipAddress = InetAddress.getByName("127.0.0.1");tcpParameters.setHost(ipAddress);//設置連接和端口tcpParameters.setKeepAlive(true);tcpParameters.setPort(Modbus.TCP_PORT);//使用TCP默認端口502// 創建主機ModbusMaster master = ModbusMasterFactory.createModbusMasterTCP(tcpParameters);Modbus.setAutoIncrementTransactionId(true);//初始化為未連接master.disconnect();int slaveId = 1;//設置從機地址默認為1btn[0].addActionListener(a -> {if (a.getActionCommand().equals("連接")) {if (!master.isConnected()) {try {master.connect();//開啟連接jl[5].setText("已連接");jl[5].setForeground(Color.BLUE);JOptionPane.showMessageDialog(null,"連接成功!", "提示", JOptionPane.INFORMATION_MESSAGE);} catch (Exception e) {e.printStackTrace();}}}});btn[1].addActionListener(a -> {if (a.getActionCommand().equals("斷開")) {try {master.disconnect();jl[5].setText("未連接");jl[5].setForeground(Color.RED);JOptionPane.showMessageDialog(null,"斷開連接成功!", "提示", JOptionPane.INFORMATION_MESSAGE);} catch (Exception e) {e.printStackTrace();}}});btn[2].addActionListener(a -> {if (a.getActionCommand().equals("采集數據") && master.isConnected()) {//獲取編輯框中的數據String readAddress = jtf[0].getText();int r_address = Integer.parseInt(readAddress);//寄存器讀取開始地址,轉換為int型int quantity = 1;//讀取的寄存器數量try {//讀取對應從機的數據,readInputRegistersint[] registerValues = master.readHoldingRegisters(slaveId, r_address-1, quantity);//顯示在指定組件for (int value : registerValues) {jtf[1].setText(String.valueOf(value));}} catch (Exception e) {e.printStackTrace();}JOptionPane.showMessageDialog(null, "數據采集成功!","提示", JOptionPane.INFORMATION_MESSAGE);} else {JOptionPane.showMessageDialog(null, "請先進行連接!","提示", JOptionPane.ERROR_MESSAGE);}});btn[3].addActionListener(a -> {if (a.getActionCommand().equals("更改數據") && master.isConnected()) {String writeAddress = String.valueOf(jtf[2].getText());int w_address = Integer.parseInt(writeAddress);int w_data = Integer.parseInt(jtf[3].getText());try {master.writeSingleRegister(slaveId, w_address-1, w_data);} catch (Exception e) {e.printStackTrace();}} else {JOptionPane.showMessageDialog(null, "請先進行連接!","提示", JOptionPane.ERROR_MESSAGE);}});總結
以上是生活随笔為你收集整理的Java实现Modbus/TCP客户端与modsim通信的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: fiddler显示客户端请求时间
- 下一篇: mysql中下杠怎么打_怎么打字母下方的