Skip to content

Commit 241ec89

Browse files
committed
Added register scanner.
1 parent e1d7815 commit 241ec89

File tree

9 files changed

+1326
-2
lines changed

9 files changed

+1326
-2
lines changed
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
/*
2+
* Copyright 2023 Matt Jamesson <scifidryer@gmail.com>.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package modbusmechanic;
17+
18+
import com.intelligt.modbus.jlibmodbus.master.ModbusMaster;
19+
import com.intelligt.modbus.jlibmodbus.master.ModbusMasterTCP;
20+
import com.intelligt.modbus.jlibmodbus.msg.base.AbstractDataRequest;
21+
import com.intelligt.modbus.jlibmodbus.msg.base.AbstractMultipleRequest;
22+
import com.intelligt.modbus.jlibmodbus.msg.base.AbstractWriteMultipleRequest;
23+
import com.intelligt.modbus.jlibmodbus.msg.base.ModbusResponse;
24+
import com.intelligt.modbus.jlibmodbus.msg.request.ReadCoilsRequest;
25+
import com.intelligt.modbus.jlibmodbus.msg.request.ReadDiscreteInputsRequest;
26+
import com.intelligt.modbus.jlibmodbus.msg.request.ReadHoldingRegistersRequest;
27+
import com.intelligt.modbus.jlibmodbus.msg.request.ReadInputRegistersRequest;
28+
import com.intelligt.modbus.jlibmodbus.msg.request.WriteMultipleCoilsRequest;
29+
import com.intelligt.modbus.jlibmodbus.msg.request.WriteMultipleRegistersRequest;
30+
import com.intelligt.modbus.jlibmodbus.msg.request.WriteSingleRegisterRequest;
31+
import com.intelligt.modbus.jlibmodbus.exception.ModbusIOException;
32+
import java.nio.ByteBuffer;
33+
34+
/**
35+
*
36+
* @author Matt Jamesson <scifidryer@gmail.com>
37+
*/
38+
public abstract class AbstractModbusMaster {
39+
protected ModbusMaster master;
40+
public void setResponseTimeout(int timeout)
41+
{
42+
master.setResponseTimeout(timeout);
43+
}
44+
public ModbusResponse generateModbusMessage(int protocolId, int transactionId, int slaveNode, int functionCode, int register, int quantity, byte[] values) throws Exception
45+
{
46+
ModbusResponse response = null;
47+
if (!master.isConnected())
48+
{
49+
master.connect();
50+
}
51+
AbstractDataRequest request = null;
52+
if (functionCode == 1)
53+
{
54+
request = new ReadCoilsRequest();
55+
}
56+
if (functionCode == 2)
57+
{
58+
request = new ReadDiscreteInputsRequest();
59+
}
60+
if (functionCode == 3)
61+
{
62+
request = new ReadHoldingRegistersRequest();
63+
}
64+
else if (functionCode == 4)
65+
{
66+
request = new ReadInputRegistersRequest();
67+
}
68+
else if (functionCode == 6)
69+
{
70+
request = new WriteSingleRegisterRequest();
71+
}
72+
else if (functionCode == 15)
73+
{
74+
request = new WriteMultipleCoilsRequest();
75+
}
76+
else if (functionCode == 16)
77+
{
78+
request = new WriteMultipleRegistersRequest();
79+
}
80+
request.setServerAddress(slaveNode);
81+
request.setStartAddress(register);
82+
if (request instanceof AbstractMultipleRequest)
83+
{
84+
((AbstractMultipleRequest)(request)).setQuantity(quantity);
85+
}
86+
if (request instanceof AbstractWriteMultipleRequest)
87+
{
88+
((AbstractWriteMultipleRequest)(request)).setBytes(values);
89+
}
90+
if (request instanceof WriteSingleRegisterRequest)
91+
{
92+
//cast the two bytes here to a short, because the only accepted input is a short
93+
ByteBuffer bb = ByteBuffer.allocate(2);
94+
bb.put(values[0]);
95+
bb.put(values[1]);
96+
((WriteSingleRegisterRequest)(request)).setValue(bb.getShort(0));
97+
}
98+
if (master instanceof ModbusMasterTCP)
99+
{
100+
master.setTransactionId(transactionId);
101+
request.setProtocolId(protocolId);
102+
}
103+
response = master.processRequest(request);
104+
return response;
105+
}
106+
public void disconnect() throws ModbusIOException
107+
{
108+
master.disconnect();
109+
}
110+
}

src/modbusmechanic/Bundle.properties

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ PacketFrame.jMenuItem2.toolTipText=
3636
PacketFrame.jMenuItem2.text=Start TCP Slave->RTU Master gateway...
3737
PacketFrame.jMenuItem3.text=RTU Scanner...
3838
PacketFrame.valueLabel.text=Response value:
39-
PacketFrame.jLabel5.text=Function
39+
PacketFrame.jLabel5.text=Scan group
4040
PacketFrame.jLabel2.text=Slave Node
4141
PacketFrame.portField.toolTipText=
4242
PacketFrame.portField.text=502
@@ -66,3 +66,4 @@ PacketFrame.jLabel12.text=Port
6666
PacketFrame.jLabel8.text=Data value type
6767
PacketFrame.jLabel14.text=Serial settings
6868
PacketFrame.jLabel7.text=Quantity
69+
PacketFrame.jMenuItem6.text=Register Scanner...

src/modbusmechanic/Bundle_de.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ PacketFrame.displayTtySerial.text=tty serielle Anschluss anzeigen
55
PacketFrame.jLabel4.text=Protokoll ID
66
PacketFrame.jLabel11.text=Art:
77
PacketFrame.jLabel3.text=Transaktion
8-
PacketFrame.jLabel6.text=Registrieren
8+
PacketFrame.jLabel6.text=Register
99
PacketFrame.jMenu3.text=Information
1010
PacketFrame.startModbusBridge.text=Modbus-Br\u00fccke starten
1111
PacketFrame.valueLabel.text=Ansprechwert:
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/*
2+
* Copyright 2023 Matt Jamesson <scifidryer@gmail.com>.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package modbusmechanic;
17+
18+
import com.intelligt.modbus.jlibmodbus.master.ModbusMaster;
19+
import com.intelligt.modbus.jlibmodbus.master.ModbusMasterFactory;
20+
import com.intelligt.modbus.jlibmodbus.serial.SerialParameters;
21+
import com.intelligt.modbus.jlibmodbus.serial.SerialPort;
22+
import com.intelligt.modbus.jlibmodbus.serial.SerialPortFactoryPJC;
23+
import com.intelligt.modbus.jlibmodbus.serial.SerialUtils;
24+
import static modbusmechanic.ModbusMechanic.castToBaud;
25+
import static modbusmechanic.ModbusMechanic.castToParity;
26+
27+
/**
28+
*
29+
* @author Matt Jamesson <scifidryer@gmail.com>
30+
*/
31+
public class ModbusRTUMaster extends AbstractModbusMaster {
32+
public ModbusRTUMaster(String comPort, int baudRate, int dataBits, int stopBits, int parityTmp)
33+
{
34+
try {
35+
SerialPort.BaudRate baud = castToBaud(baudRate);
36+
SerialPort.Parity parity = castToParity(parityTmp);
37+
SerialParameters serialParameters = new SerialParameters(comPort, baud, dataBits, stopBits, parity);
38+
SerialUtils.setSerialPortFactory(new SerialPortFactoryPJC());
39+
master = ModbusMasterFactory.createModbusMasterRTU(serialParameters);
40+
}
41+
catch (Exception e)
42+
{
43+
if (ModbusMechanic.debug)
44+
{
45+
e.printStackTrace();
46+
}
47+
}
48+
}
49+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/*
2+
* Copyright 2023 Matt Jamesson <scifidryer@gmail.com>.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package modbusmechanic;
17+
18+
import com.intelligt.modbus.jlibmodbus.master.ModbusMaster;
19+
import com.intelligt.modbus.jlibmodbus.master.ModbusMasterFactory;
20+
import com.intelligt.modbus.jlibmodbus.master.ModbusMasterTCP;
21+
import com.intelligt.modbus.jlibmodbus.msg.base.AbstractDataRequest;
22+
import com.intelligt.modbus.jlibmodbus.msg.base.AbstractMultipleRequest;
23+
import com.intelligt.modbus.jlibmodbus.msg.base.AbstractWriteMultipleRequest;
24+
import com.intelligt.modbus.jlibmodbus.msg.base.ModbusResponse;
25+
import com.intelligt.modbus.jlibmodbus.msg.request.ReadCoilsRequest;
26+
import com.intelligt.modbus.jlibmodbus.msg.request.ReadDiscreteInputsRequest;
27+
import com.intelligt.modbus.jlibmodbus.msg.request.ReadHoldingRegistersRequest;
28+
import com.intelligt.modbus.jlibmodbus.msg.request.ReadInputRegistersRequest;
29+
import com.intelligt.modbus.jlibmodbus.msg.request.WriteMultipleCoilsRequest;
30+
import com.intelligt.modbus.jlibmodbus.msg.request.WriteMultipleRegistersRequest;
31+
import com.intelligt.modbus.jlibmodbus.msg.request.WriteSingleRegisterRequest;
32+
import com.intelligt.modbus.jlibmodbus.tcp.TcpParameters;
33+
import java.net.InetAddress;
34+
import java.nio.ByteBuffer;
35+
36+
/**
37+
*
38+
* @author Matt Jamesson <scifidryer@gmail.com>
39+
*/
40+
public class ModbusTCPMaster extends AbstractModbusMaster{
41+
42+
public ModbusTCPMaster(String host, int port) throws Exception
43+
{
44+
TcpParameters tcpParameters = new TcpParameters();
45+
tcpParameters.setHost(InetAddress.getByName(host));
46+
tcpParameters.setKeepAlive(true);
47+
tcpParameters.setPort(port);
48+
master = ModbusMasterFactory.createModbusMasterTCP(tcpParameters);
49+
}
50+
}

src/modbusmechanic/PacketFrame.form

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,16 @@
6060
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jMenuItem2ActionPerformed"/>
6161
</Events>
6262
</MenuItem>
63+
<MenuItem class="javax.swing.JMenuItem" name="jMenuItem6">
64+
<Properties>
65+
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
66+
<ResourceString bundle="modbusmechanic/Bundle.properties" key="PacketFrame.jMenuItem6.text" replaceFormat="java.util.ResourceBundle.getBundle(&quot;{bundleNameSlashes}&quot;).getString(&quot;{key}&quot;)"/>
67+
</Property>
68+
</Properties>
69+
<Events>
70+
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jMenuItem6ActionPerformed"/>
71+
</Events>
72+
</MenuItem>
6373
<MenuItem class="javax.swing.JMenuItem" name="startModbusBridge">
6474
<Properties>
6575
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">

src/modbusmechanic/PacketFrame.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ private void initComponents() {
179179
rtuSerialMonitorItem = new javax.swing.JMenuItem();
180180
jMenuItem3 = new javax.swing.JMenuItem();
181181
jMenuItem2 = new javax.swing.JMenuItem();
182+
jMenuItem6 = new javax.swing.JMenuItem();
182183
startModbusBridge = new javax.swing.JMenuItem();
183184
jMenu1 = new javax.swing.JMenu();
184185
addBookmarkItem = new javax.swing.JMenuItem();
@@ -552,6 +553,14 @@ public void actionPerformed(java.awt.event.ActionEvent evt) {
552553
});
553554
jMenu2.add(jMenuItem2);
554555

556+
jMenuItem6.setText(bundle.getString("PacketFrame.jMenuItem6.text")); // NOI18N
557+
jMenuItem6.addActionListener(new java.awt.event.ActionListener() {
558+
public void actionPerformed(java.awt.event.ActionEvent evt) {
559+
jMenuItem6ActionPerformed(evt);
560+
}
561+
});
562+
jMenu2.add(jMenuItem6);
563+
555564
startModbusBridge.setText(bundle.getString("PacketFrame.startModbusBridge.text")); // NOI18N
556565
startModbusBridge.setToolTipText(bundle.getString("PacketFrame.startModbusBridge.toolTipText")); // NOI18N
557566
startModbusBridge.addActionListener(new java.awt.event.ActionListener() {
@@ -1674,6 +1683,10 @@ private void jMenuItem5ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FI
16741683
}
16751684
}//GEN-LAST:event_jMenuItem5ActionPerformed
16761685

1686+
private void jMenuItem6ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem6ActionPerformed
1687+
(new RegisterScannerFrame()).setVisible(true);
1688+
}//GEN-LAST:event_jMenuItem6ActionPerformed
1689+
16771690
private DefaultComboBoxModel getPortNames()
16781691
{
16791692
String[] portNames = ModbusMechanic.getPortNames();
@@ -1764,6 +1777,7 @@ public static void main(String args[]) {
17641777
private javax.swing.JMenuItem jMenuItem3;
17651778
private javax.swing.JMenuItem jMenuItem4;
17661779
private javax.swing.JMenuItem jMenuItem5;
1780+
private javax.swing.JMenuItem jMenuItem6;
17671781
private javax.swing.JPanel jPanel5;
17681782
private javax.swing.JScrollPane jScrollPane1;
17691783
private javax.swing.JSeparator jSeparator1;

0 commit comments

Comments
 (0)