From 369cee6f26d096dfb0362168b1aae85ec142209e Mon Sep 17 00:00:00 2001 From: LiuYuancheng Date: Wed, 26 Jul 2023 14:36:38 +0800 Subject: [PATCH] Added the Railway Stations Sensor-Signal System Control PLC Simulator readme document. --- doc/designDoc.pptx | Bin 1275260 -> 1286423 bytes doc/img/stationPlc/operatingLogic.png | Bin 0 -> 38055 bytes doc/sensorsPLCSimu_readme.md | 13 +- doc/stationPLCSimu_readme.md | 172 ++++++++++++++++++ .../stationPlcEmu/plcConfig_tamplate.txt | 29 +++ .../stationPlcEmu/plcSimGlobalStation.py | 28 ++- .../stationPlcEmu/plcSimulatorStation.py | 16 +- src/plcCtrl/stationPlcEmu/readme.md | 21 +++ 8 files changed, 257 insertions(+), 22 deletions(-) create mode 100644 doc/img/stationPlc/operatingLogic.png create mode 100644 doc/stationPLCSimu_readme.md create mode 100644 src/plcCtrl/stationPlcEmu/plcConfig_tamplate.txt create mode 100644 src/plcCtrl/stationPlcEmu/readme.md diff --git a/doc/designDoc.pptx b/doc/designDoc.pptx index 6ab07cb2d9152602cf0546b36f58be630affbe3e..2f6f508ded7ecb47fc98c2389342f6873f5ddce4 100644 GIT binary patch delta 16918 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 Sa(;jVcuWl~465`nr2ha|V&en= literal 0 HcmV?d00001 diff --git a/doc/sensorsPLCSimu_readme.md b/doc/sensorsPLCSimu_readme.md index 1a52262..03e5d45 100644 --- a/doc/sensorsPLCSimu_readme.md +++ b/doc/sensorsPLCSimu_readme.md @@ -1,16 +1,16 @@ -# Railway Sensor-Signal System Control PLC Simulator +# Railway Junctions Sensor-Signal System Control PLC Simulator **Project Design :** we want to create a Programmable Logic Controllers(PLC) set with 3 PLCs to below tasks: 1. Read the 39 train sensors (connect to PLCs' input) state from the real-word emulator to PLCs' holding register state. 2. Run the pre-set ladder logic (flip-flop latching relay) to change the 19 real-world signals (connect to PLCs' output coils) state. -3. Create a ModBus server to handle the HMI's ModBus TCP request to update/change register/coils value. +3. Create a Modbus server to handle the HMI's Modbus TCP request to update/change register/coils value. This simulator will simulate 3 standard Siemens S71200 PLCs (16 input + 8 output / total 48 input + 24 output) PLCs connected under master and salve mode with rs422 multi-drop cable as below: ![](img/sensorPlc/readme0.png) -So the HMI can control 3 PLCs' state by connecting master PLC's ip address through ModBus TCP protocol. +So the HMI can control 3 PLCs' state by connecting master PLC's ip address through Modbus TCP protocol. [TOC] @@ -18,7 +18,7 @@ So the HMI can control 3 PLCs' state by connecting master PLC's ip address throu ### Introduction -Railway Sensor-Signal System Control PLC Simulator is part of the Railway IT/OT System security test platform. It is used to control the sensors-signals system of the railway junctions. You can refer the system topology diagram to check its function in the system by below link: +Railway Junction Sensor-Signal System Control PLC Simulator is part of the Railway IT/OT System security test platform. It is used to control the sensors-signals system of the railway junctions. You can refer the system topology diagram to check its function in the system by below link: - [Railway IT/OT System security test platform system structure diagram](img/networkCommDesign.png) - [Railway IT/OT System security test platform network topology diagram](img/networkDesign.png) @@ -111,8 +111,6 @@ VM Deploy Config: ### Program Usage - - ##### Edit Configuration File Open config file `plcConfig.txt` @@ -173,4 +171,5 @@ Refer to `doc/ProblemAndSolution.md` ------ -> last edit by LiuYuancheng (liu_yuan_cheng@hotmail.com) by 26/07/2023 if you have any problem, please send me a message. \ No newline at end of file +> last edit by LiuYuancheng (liu_yuan_cheng@hotmail.com) by 26/07/2023 if you have any problem, please send me a message. + diff --git a/doc/stationPLCSimu_readme.md b/doc/stationPLCSimu_readme.md new file mode 100644 index 0000000..d6688ad --- /dev/null +++ b/doc/stationPLCSimu_readme.md @@ -0,0 +1,172 @@ +# Railway Stations Sensor-Signal System Control PLC Simulator + +**Project Design :** we want to create a Programmable Logic Controllers(PLC) set with 3 PLCs to below tasks: + +1. Read the 22 train stations' train dock sensors (connect to PLCs' input) from the real-word emulator to PLCs' holding register state. +2. Run the pre-set ladder logic (direct trigger latching relay) to change the 44 real-world station enter/exit signals (connect to PLCs' output coils) state. +3. Create a Modbus server to handle the HMI's Modbus TCP request to update/change register/coils value. + +This simulator will simulate 3 standard Siemens S71200 PLCs (16 input + 8 output / total 48 input + 24 output) PLCs connected under master and salve mode with rs422 multi-drop cable as below: + +![](img/sensorPlc/readme0.png) + +So the HMI can control 3 PLCs' state by connecting master PLC's ip address through Modbus TCP protocol. + +[TOC] + +------ + +### Introduction + +Railway Station Sensor-Signal System Control PLC Simulator is part of the Railway IT/OT System security test platform. It is used to control the trains' docking process in the railway system. You can refer the system topology diagram to check its function in the system by below link: + +- [Railway IT/OT System security test platform system structure diagram](img/networkCommDesign.png) +- [Railway IT/OT System security test platform network topology diagram](img/networkDesign.png) + +Three PLC (PLC-03, PLC-04, PLC05) are involved in this program, PLC-03 is the master and PLC-04, PLC-05 are the salve. This program is used to control the railway's station system. There will be 22 input and 22 output and 22 ladder logic in this PLC set. + +Each station is controlled by one train docking sensor and 2 train block signals(enter/exit), Below diagram shows the wire connection and steps of how one of the 22 ladder logic controls a station. + +- When a docking sensor is trigger, station will raise exit block signal to total stop the train, then raise enter block signal to avoid other train enter. +- When the docking train finishes, station will turn off the exit block signal to release the train, the turn off the enter block signal to allow other trains dock. + +![](img/stationPlc/operatingLogic.png) + +**Program version:** `v0.1.2` + +Code base: https://github.com/LiuYuancheng/Metro_emulator/tree/main/src/plcCtrl/stationPlcEmu + + + +------ + +The program contents 3 main thread : + +- Real-world communication thread to fetch junction sensors data and set signals state. +- Ladder logic execution state, once there is holding registers' state change, executed the related binding logic to change the coils state. +- Modbus server thread to handling the Modbus TCP request from HMI. + +This is the program modules workflow diagram: + +![](img/sensorPlc/workflow.png) + +##### System ladder logic + +The system contents 19 ladder logic which shown in the introduction. The PLC input => Holding register => ladder logic => Coil => PLC output map is shown below: + +![](img/stationPlc.png) + +You can also check the excel file `ladderConnectionMap.xlsx` to see the mapping detail. + + + +##### Program module files list + +| Idx | Program File | Execution Env | Description | +| ---- | ------------------------------------ | ------------- | ------------------------------------------------------------ | +| 1 | stationPlcEmu/plcConfig.txt | | System config file. | +| 2 | stationPlcEmu/plcSimGlobalStation.py | python 3 | System needs global file, the system config file's contents will be saved in the global parameters. | +| 3 | stationPlcEmu/plcSimulatorStation.py | python 3 | Main PLC simulation program. | +| | | | | + +Libraries required code base: https://github.com/LiuYuancheng/Metro_emulator/tree/main/src/lib + + + +------ + +### Program Setup + +###### Development Environment : python 3.7.4 + +###### Additional Lib/Software Need + +1. **pyModbusTCP** : https://github.com/sourceperl/pyModbusTCP + +``` +pip install pyModbusTCP +``` + +###### Hardware Needed : None + +###### Execution environment + +``` +OS : ubuntu 20.04 server +Display mode: +- Display output: No +VM Deploy Config: +- NIC number: 2 +- SSH: enable +- NIC 1: IP address: 10.0.10.12, gateway: 10.0.10.1 +- NIC 2: IP address: 192.168.100.12, gateway: 192.168.100.1 +``` + + + +------ + +### Program Usage + +##### Edit Configuration File + +Open config file `plcConfig.txt` + +``` +# This is the config file template for the module +# Setup the paramter with below format (every line follow : format, the +# key can not be changed): + +# Set the master PLC's name +PLC_NAME:PLC-03 + +# Define the ip addresses allowed to read PLC state: +# json list fomat: ["masterIP", "slave1IP", ...] +ALLOW_R_L:["127.0.0.1", "192.168.0.10"] + +# Define the ip addresses allowed to change PLC state: +# json list fomat: ["masterIP", "slave1IP", ...] +ALLOW_W_L:["127.0.0.1"] + +# Define Realworld emulator ip +RW_IP:127.0.0.1 + +# Define Realworld emulator connection port +RW_PORT:3001 + +# Define PLC clock interval +CLK_INT:0.9 + +# Define modbus TCP host IP, use 0.0.0.0 or localhost +MD_BUS_IP:localhost + +# Define modbus TCP host Port, normally use 502 +MD_BUS_PORT:503 +``` + + + +##### Program Execution + +After follow the instruction in the file `metroConfig.txt` to setup all the parameters, you can run the program: + +``` +python plcSimulatorStation.py +``` + +or double click the file `runStationPlcCtrlEmu_win.bat` + + + +------ + +#### Problem and Solution + +Refer to `doc/ProblemAndSolution.md` + + + +------ + +> last edit by LiuYuancheng (liu_yuan_cheng@hotmail.com) by 26/07/2023 if you have any problem, please send me a message. + diff --git a/src/plcCtrl/stationPlcEmu/plcConfig_tamplate.txt b/src/plcCtrl/stationPlcEmu/plcConfig_tamplate.txt new file mode 100644 index 0000000..ebf53a7 --- /dev/null +++ b/src/plcCtrl/stationPlcEmu/plcConfig_tamplate.txt @@ -0,0 +1,29 @@ +# This is the config file template for the module +# Setup the paramter with below format (every line follow : format, the +# key can not be changed): + +# Set the master PLC's name +PLC_NAME:PLC-03 + +# Define the ip addresses allowed to read PLC state: +# json list fomat: ["masterIP", "slave1IP", ...] +ALLOW_R_L:["127.0.0.1", "192.168.0.10"] + +# Define the ip addresses allowed to change PLC state: +# json list fomat: ["masterIP", "slave1IP", ...] +ALLOW_W_L:["127.0.0.1"] + +# Define Realworld emulator ip +RW_IP:127.0.0.1 + +# Define Realworld emulator connection port +RW_PORT:3001 + +# Define PLC clock interval +CLK_INT:0.9 + +# Define modbus TCP host IP, use 0.0.0.0 or localhost +MD_BUS_IP:localhost + +# Define modbus TCP host Port, normally use 502 +MD_BUS_PORT:503 \ No newline at end of file diff --git a/src/plcCtrl/stationPlcEmu/plcSimGlobalStation.py b/src/plcCtrl/stationPlcEmu/plcSimGlobalStation.py index c330d3a..677ff84 100644 --- a/src/plcCtrl/stationPlcEmu/plcSimGlobalStation.py +++ b/src/plcCtrl/stationPlcEmu/plcSimGlobalStation.py @@ -7,8 +7,9 @@ # Author: Yuancheng Liu # # Created: 2010/08/26 -# Copyright: -# License: +# Version: v0.1.2 +# Copyright: Copyright (c) 2023 Singapore National Cybersecurity R&D Lab LiuYuancheng +# License: MIT License #----------------------------------------------------------------------------- """ For good coding practice, follow the following naming convention: @@ -26,6 +27,7 @@ TOPDIR = 'src' LIBDIR = 'lib' +CONFIG_FILE_NAME = 'plcConfig.txt' idx = dirpath.find(TOPDIR) gTopDir = dirpath[:idx + len(TOPDIR)] if idx != -1 else dirpath # found it - truncate right after TOPDIR @@ -43,16 +45,27 @@ LOG_ERR = 2 LOG_EXCEPT = 3 -# Init the PLC info. -PLC_NAME = 'PLC-03' -ALLOW_R_L = ['127.0.0.1', '192.168.0.10'] -ALLOW_W_L = ['127.0.0.1'] +#----------------------------------------------------------------------------- +# Init the configure file loader. +import ConfigLoader +gGonfigPath = os.path.join(dirpath, CONFIG_FILE_NAME) +iConfigLoader = ConfigLoader.ConfigLoader(gGonfigPath, mode='r') +if iConfigLoader is None: + print("Error: The config file %s is not exist.Program exit!" %str(gGonfigPath)) + exit() +CONFIG_DICT = iConfigLoader.getJson() +# Init the PLC info. +PLC_NAME = CONFIG_DICT['PLC_NAME'] +ALLOW_R_L = CONFIG_DICT['ALLOW_R_L'] +ALLOW_W_L = CONFIG_DICT['ALLOW_W_L'] #------------------------------------------- # VARIABLES are the built in data type. gRealWordIP = ('127.0.0.1', 3001) -gInterval = 0.9 +gRealWordIP = (CONFIG_DICT['RW_IP'], int(CONFIG_DICT['RW_PORT'])) +gInterval = float(CONFIG_DICT['CLK_INT']) +gModBusIP = (CONFIG_DICT['MD_BUS_IP'], int(CONFIG_DICT['MD_BUS_PORT'])) def gDebugPrint(msg, prt=True, logType=None): if prt: print(msg) @@ -65,7 +78,6 @@ def gDebugPrint(msg, prt=True, logType=None): elif logType == LOG_INFO or DEBUG_FLG: Log.info(msg) - #------------------------------------------------------------ iMBhandler = None # modbus TCP data handler. iMBservice = None # modbus TCP service diff --git a/src/plcCtrl/stationPlcEmu/plcSimulatorStation.py b/src/plcCtrl/stationPlcEmu/plcSimulatorStation.py index 70569d4..930a005 100644 --- a/src/plcCtrl/stationPlcEmu/plcSimulatorStation.py +++ b/src/plcCtrl/stationPlcEmu/plcSimulatorStation.py @@ -31,7 +31,8 @@ #----------------------------------------------------------------------------- #----------------------------------------------------------------------------- class directConnLadderLogic(modbusTcpCom.ladderLogic): - """ A Direct connection ladder logic diagram set + """ A direct connection ladder logic diagram set, holding registers will + trigger the connected coils. """ def __init__(self, parent, ladderName) -> None: super().__init__(parent, ladderName=ladderName) @@ -43,8 +44,7 @@ def initLadderInfo(self): self.srcCoilsInfo['offset'] = None self.destCoilsInfo['address'] = 0 self.destCoilsInfo['offset'] = 22 - # Init the flipflop coils and registers config: - # For total 39 holding registers connected addresses + # For total 22 holding registers connected addresses # address: 0 - 9: weline stations # address: 10 - 15: nsline stations # address: 16 - 21: ccline sensors. @@ -71,8 +71,9 @@ class stationPlcSet(plcSimulator.plcSimuInterface): the output coils state based on the ladder logic. - Send the signal setup request to the real world emulator to change the signal. """ - def __init__(self, parent, plcID, addressInfoDict, ladderObj): - super().__init__(parent, plcID, addressInfoDict, ladderObj) + def __init__(self, parent, plcID, addressInfoDict, ladderObj, updateInt=0.6): + super().__init__(parent, plcID, addressInfoDict, ladderObj, + updateInt=updateInt) def initInputState(self): self.regsAddrs = (0, 22) @@ -104,12 +105,13 @@ def main(): gv.gDebugPrint("Start Init the PLC: %s" %str(gv.PLC_NAME), logType=gv.LOG_INFO) gv.iLadderLogic = directConnLadderLogic(None, ladderName='Direct_connection') addressInfoDict = { - 'hostaddress': ('localhost', 503), + 'hostaddress': gv.gModBusIP, 'realworld':gv.gRealWordIP, 'allowread':gv.ALLOW_R_L, 'allowwrite': gv.ALLOW_W_L } - plc = stationPlcSet(None, gv.PLC_NAME, addressInfoDict, gv.iLadderLogic) + plc = stationPlcSet(None, gv.PLC_NAME, addressInfoDict, + gv.iLadderLogic, updateInt=gv.gInterval) plc.run() if __name__ == "__main__": diff --git a/src/plcCtrl/stationPlcEmu/readme.md b/src/plcCtrl/stationPlcEmu/readme.md new file mode 100644 index 0000000..7076a25 --- /dev/null +++ b/src/plcCtrl/stationPlcEmu/readme.md @@ -0,0 +1,21 @@ +# Railway Stations Sensor-Signal System Control PLC Simulator + +### Introduction + +**Please refer to the Railway Stations Sensor-Signal System Control PLC Simulator Readme file in the document fold with the below section: ** + +- Introduction +- Program design +- Program Setup steps +- Execute the program +- Problem and solution + +**Click below link to jump to the readme file:** + +[ Railway Sensor-Signal System Control PLC Simulator Readme file ](../../doc/stationPLCSimu_readme.md) + + + +------ + +> last edit by LiuYuancheng (liu_yuan_cheng@hotmail.com) by 26/07/2023 if you have any problem, please send me a message. \ No newline at end of file