Skip to content

Commit 5992d7c

Browse files
committed
tests: Add initial test case for Modbus server
Includes new test group for the modbus server, alongside the initial test case where the modbus server is coneceted to by a client on the github action's runner. Currently, the github actions runner connects to the modbus server to read and write to the LED and Button register(s). Will need to update test case as registers are implemented in the modbus server container. This commit also includes changes in tests.yml in order to run the test group and store the github artifact. Signed-off-by: Matthew Gee <mgee@iol.unh.edu>
1 parent d0ba8dd commit 5992d7c

5 files changed

Lines changed: 157 additions & 0 deletions

File tree

.github/workflows/tests.yml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,19 @@ jobs:
2929
with:
3030
name: "FlashValidation.log"
3131
path: /tmp/flashValidation.log
32+
33+
- name: Modbus Server Validation Tests
34+
run: |
35+
cd tests && bash beginTests.sh "modbusServerValidation"
36+
37+
- name: Print Modbus Server Validation Logs
38+
if: always()
39+
run: cat /tmp/modbusServerValidation.log
40+
41+
- name: Upload log file as artifact
42+
if: always()
43+
uses: actions/upload-artifact@v4
44+
with:
45+
name: "ModbusServerValidation.log"
46+
path: /tmp/modbusServerValidation.log
47+
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
echo "Cleanup is complete"
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
{
2+
"name": "Modbus Server Validation",
3+
"description": "Test the Ocre Modbus server ",
4+
"setup": [
5+
{
6+
"name": "Modbus Server Validation Setup",
7+
"exec": "bash setup.sh"
8+
}
9+
],
10+
"test_suites": [
11+
{
12+
"name": "Modubs Validation Tests",
13+
"description": "Tests the modbus server container runtime",
14+
"board" : "b_u585i_iot02a",
15+
"test_cases": [
16+
{
17+
"name": "Check Modbus communication with remote client",
18+
"exec": "./modbusServer_validation_remote.py"
19+
},
20+
{
21+
"name": "Check Modbus communication with local client",
22+
"exec": ""
23+
}
24+
]
25+
}
26+
],
27+
"cleanup": [
28+
{
29+
"name": "Modbus Server Validation Cleanup",
30+
"exec": "bash clean.sh"
31+
}
32+
]
33+
}
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
#!/usr/bin/env python3
2+
3+
import serial
4+
import time
5+
import sys
6+
from pymodbus.client import ModbusTcpClient
7+
8+
def exitSafe(conn: serial.Serial, client: ModbusTcpClient, exitCode: int):
9+
conn.close()
10+
client.close()
11+
sys.exit(exitCode)
12+
13+
"""
14+
This testcase is to be used following a modbus server being installed on a board.
15+
16+
The testcase forms a serial connection to the board, sends a break to start the Modbus server,
17+
and reads / writes to registers on the modbus server through a connection on the testing agent
18+
"""
19+
20+
def main():
21+
print("starting Modbus server:")
22+
23+
conn = serial.Serial('/dev/ttyACM0', 115200, timeout=1)
24+
conn.send_break(duration=1)
25+
26+
# Wait for modbus server to be up
27+
time.sleep(5)
28+
29+
print("----* Reading client connection status *----")
30+
client_remote = ModbusTcpClient("132.177.122.245", port=1502)
31+
client_remote.connect()
32+
33+
connection_results = [client_remote.connected, client_remote.is_socket_open()]
34+
35+
print(connection_results)
36+
if (connection_results != [True, True]):
37+
exitSafe(conn, client_remote, 1)
38+
39+
print("----* Testing LED Control Register *----")
40+
41+
led_results = []
42+
43+
led_results.append(client_remote.read_holding_registers(0x00).registers[0]) # 0
44+
client_remote.write_register(0x00, 0x01)
45+
time.sleep(5)
46+
led_results.append(client_remote.read_holding_registers(0x00).registers[0]) # 1
47+
client_remote.write_register(0x00, 0x02)
48+
time.sleep(5)
49+
led_results.append(client_remote.read_holding_registers(0x00).registers[0]) # 2
50+
client_remote.write_register(0x00, 0x00)
51+
time.sleep(5)
52+
led_results.append(client_remote.read_holding_registers(0x00).registers[0]) # 0
53+
54+
print(led_results)
55+
if (led_results != [0,1,2,0]):
56+
exitSafe(conn, client_remote, 1)
57+
58+
59+
print("----* Test Button Press Count Register *----")
60+
button_result = (client_remote.read_holding_registers(0x01).registers[0]) # 0
61+
62+
if button_result != 0:
63+
exitSafe(conn, client_remote, 1)
64+
65+
66+
print("----* Waiting for updates to Modbus server container before continuing *---")
67+
68+
# print("----* Test reading 32 bit floats *----")
69+
# print("Acceleration X")
70+
# print(client_remote.convert_from_registers([0x04, 0x05], client_remote.DATATYPE.FLOAT32, word_order="little"))
71+
# print(client_remote.read_holding_registers(0x04).registers)
72+
# print(client_remote.read_holding_registers(0x05).registers)
73+
# print(client_remote.read_input_registers(0x04).registers)
74+
# print(client_remote.read_input_registers(0x05).registers)
75+
76+
77+
# print("Gyroscope X")
78+
# print(client_remote.convert_from_registers([0x08, 0x09], client_remote.DATATYPE.FLOAT32, word_order="little"))
79+
# print(client_remote.read_holding_registers(0x08).registers)
80+
# print(client_remote.read_holding_registers(0x09).registers)
81+
# print(client_remote.read_input_registers(0x08).registers)
82+
# print(client_remote.read_input_registers(0x09).registers)
83+
84+
85+
# print("Humidity")
86+
# print(client_remote.convert_from_registers([0x14, 0x15], client_remote.DATATYPE.FLOAT32, word_order="little"))
87+
# print(client_remote.read_holding_registers(0x14).registers)
88+
# print(client_remote.read_holding_registers(0x15).registers)
89+
# print(client_remote.read_input_registers(0x14).registers)
90+
# print(client_remote.read_input_registers(0x15).registers)
91+
92+
# print("Temperature")
93+
# print(client_remote.convert_from_registers([0x16, 0x17], client_remote.DATATYPE.FLOAT32, word_order="little"))
94+
# print(client_remote.read_holding_registers(0x16).registers)
95+
# print(client_remote.read_holding_registers(0x17).registers)
96+
# print(client_remote.read_input_registers(0x16).registers)
97+
# print(client_remote.read_input_registers(0x17).registers)
98+
99+
print("----* Closing Connection *----")
100+
exitSafe(conn, client_remote, 0)
101+
102+
if __name__ == "__main__":
103+
main()
104+
105+
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# Assumes board is being flashed with both hello world and modbus-server
2+
echo "Setup is complete"

0 commit comments

Comments
 (0)