PyTool Modbus TCP

10+
๋‹ค์šด๋กœ๋“œ
์ฝ˜ํ…์ธ  ๋“ฑ๊ธ‰
์ „์ฒด์ด์šฉ๊ฐ€
์Šคํฌ๋ฆฐ์ƒท ์ด๋ฏธ์ง€
์Šคํฌ๋ฆฐ์ƒท ์ด๋ฏธ์ง€
์Šคํฌ๋ฆฐ์ƒท ์ด๋ฏธ์ง€
์Šคํฌ๋ฆฐ์ƒท ์ด๋ฏธ์ง€
์Šคํฌ๋ฆฐ์ƒท ์ด๋ฏธ์ง€
์Šคํฌ๋ฆฐ์ƒท ์ด๋ฏธ์ง€
์Šคํฌ๋ฆฐ์ƒท ์ด๋ฏธ์ง€
์Šคํฌ๋ฆฐ์ƒท ์ด๋ฏธ์ง€
์Šคํฌ๋ฆฐ์ƒท ์ด๋ฏธ์ง€
์Šคํฌ๋ฆฐ์ƒท ์ด๋ฏธ์ง€
์Šคํฌ๋ฆฐ์ƒท ์ด๋ฏธ์ง€
์Šคํฌ๋ฆฐ์ƒท ์ด๋ฏธ์ง€
์Šคํฌ๋ฆฐ์ƒท ์ด๋ฏธ์ง€
์Šคํฌ๋ฆฐ์ƒท ์ด๋ฏธ์ง€
์Šคํฌ๋ฆฐ์ƒท ์ด๋ฏธ์ง€
์Šคํฌ๋ฆฐ์ƒท ์ด๋ฏธ์ง€
์Šคํฌ๋ฆฐ์ƒท ์ด๋ฏธ์ง€
์Šคํฌ๋ฆฐ์ƒท ์ด๋ฏธ์ง€

์•ฑ ์ •๋ณด

PyTool Modbus TCP๋Š” Modbus TCP ๊ฐœ๋ฐœ, ๋””๋ฒ„๊น… ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง์„์œ„ํ•œ ํ›Œ๋ฅญํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.
์ตœ๊ณ ์˜ ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•˜๋Š” Python ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ”๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Modbus TCP ๋„๊ตฌ์— ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
์ „๊ธฐ ์—”์ง€๋‹ˆ์–ด๋Š” Android ์ „ํ™” ๋˜๋Š” ํƒœ๋ธ”๋ฆฟ๊ณผ ๊ฐ™์€ ํœด๋Œ€์šฉ ์žฅ์น˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜„์žฅ, ๊ณต์žฅ ๋˜๋Š” ์‹คํ—˜์‹ค์—์„œ Modbus TCP ํ†ต์‹ ์„ ๋””๋ฒ„๊ทธํ•˜๊ฑฐ๋‚˜ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ๊ฒƒ์ด ํŽธ๋ฆฌํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๊ฑฐ์˜ ๋ชจ๋“  Modbus TCP ํ†ต์‹  ์‹œ์Šคํ…œ์—๋Š” ์ž์ฒด ๋ฐ์ดํ„ฐ ํ˜•์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค.
"02a5b4ca .... ff000803"๊ณผ ๊ฐ™์€ 16 ์ง„์ˆ˜ ๋ฐ์ดํ„ฐ์˜ ๋ฐ”๋‹ค์—์„œ ๊ฒ€์ƒ‰ํ•˜๊ณ  ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์•Œ์•„ ๋‚ด๋ ค๋Š” ๊ฒƒ์€ ์ „ํ˜€ ์ฆ๊ฒ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์ด๊ฒƒ์ด PyTool Modbus TCP๊ฐ€ ๋„์›€์ด๋˜๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค.
์‚ฌ์šฉ์ž ์ง€์ • Python ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜์žˆ๋Š” ๊ธฐ๋Šฅ์„ ํ†ตํ•ด PyTool Modbus TCP๋Š” ์ˆ˜์‹  ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ณ  ์›ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ‘œ์‹œํ•˜๊ณ  ํ•„์š”ํ•  ๋•Œ ๊ทธ์— ๋”ฐ๋ผ ์ž‘๋™ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋น ๋ฅธ ์‹œ์ž‘์„์œ„ํ•œ ์Šคํฌ๋ฆฝํŠธ ์˜ˆ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ์ค‘ ํ•˜๋‚˜๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ ๋„ฃ์–ด ์‚ฌ์šฉํ•ด๋ณด์„ธ์š”.

์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ์„์œ„ํ•œ ํŽธ๋ฆฌํ•œ Modbus TCP ์ œ์–ด ์ธํ„ฐํŽ˜์ด์Šค๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์Šคํฌ๋ฆฝํŠธ ์ผ๋ฐ˜ ๊ฐ€์ด๋“œ
=================

*์ด ์•ฑ์—์„œ ์‚ฌ์šฉ๋˜๋Š” Python ๋ฒ„์ „์€ 3.8์ž…๋‹ˆ๋‹ค.

*์ด ์•ฑ์€ ์Šคํฌ๋ฆฝํŠธ ํŽธ์ง‘๊ธฐ๋กœ ์„ค๊ณ„๋˜์ง€ ์•Š์•˜์ง€๋งŒ ์Šคํฌ๋ฆฝํŠธ ํ•„๋“œ์—์„œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํŽธ์ง‘ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ์ข‹์•„ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ ํŽธ์ง‘๊ธฐ๋ฅผ ์‚ฌ์šฉํ•œ ๋‹ค์Œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ ๋„ฃ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

* ์ด์ƒํ•œ ์˜ค๋ฅ˜๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋“ค์—ฌ ์“ฐ๊ธฐ์— ํ•ญ์ƒ 4 ๊ฐœ์˜ ๊ณต๋ฐฑ์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

* ํ‘œ์ค€ Python ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์žˆ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ํŒจํ‚ค์ง€๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

* while ๋ฃจํ”„๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ค‘์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํ•ญ์ƒ`app.running_script`๋ฅผ ์กฐ๊ฑด์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

*`app.version`์„ ์‚ฌ์šฉํ•˜์—ฌ ์•ฑ ๋ฒ„์ „ ๋ฌธ์ž์—ด์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

*`app.get_output ()`์„ ์‚ฌ์šฉํ•˜์—ฌ ์Šคํฌ๋ฆฝํŠธ ์ถœ๋ ฅ ํ•„๋“œ๋ฅผ ๋ฌธ์ž์—ด๋กœ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

* ์Šคํฌ๋ฆฝํŠธ ์ถœ๋ ฅ ํ•„๋“œ์— 'object'๋ฅผ ๋ฌธ์ž์—ด๋กœ ํ‘œ์‹œํ•˜๋ ค๋ฉด`app.set_output (object)`๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

* ์Šคํฌ๋ฆฝํŠธ ์ถœ๋ ฅ ํ•„๋“œ์— ํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด`app.print_text (object)`๋ฅผ`app.set_output (app.get_output () + str (object))`์˜ ๋ฐ”๋กœ ๊ฐ€๊ธฐ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

*`app.clear_text ()`๋ฅผ`app.set_output ( "")`์˜ ๋ฐ”๋กœ ๊ฐ€๊ธฐ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์Šคํฌ๋ฆฝํŠธ ์ถœ๋ ฅ ํ•„๋“œ๋ฅผ ์ง€ ์›๋‹ˆ๋‹ค.

* 'app.fc01_read_coils (mbid, addr, num)'๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜ ์ฝ”๋“œ 01 ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
mbid (int) : Modbus ID
addr (int) : ๋ฐ์ดํ„ฐ ์ฃผ์†Œ
num (int) : ๋ฐ์ดํ„ฐ ์ˆ˜
return (list of int) : ์š”์ฒญ ๋œ ๋ฐ์ดํ„ฐ ๋ชฉ๋ก

* 'app.fc02_read_discrete_inputs (mbid, addr, num)'์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜ ์ฝ”๋“œ 02 ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
mbid (int) : Modbus ID
addr (int) : ๋ฐ์ดํ„ฐ ์ฃผ์†Œ
num (int) : ๋ฐ์ดํ„ฐ ์ˆ˜
return (list of int) : ์š”์ฒญ ๋œ ๋ฐ์ดํ„ฐ ๋ชฉ๋ก

*`app.fc03_read_holding_registers (mbid, addr, num)`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜ ์ฝ”๋“œ 03 ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
mbid (int) : Modbus ID
addr (int) : ๋ฐ์ดํ„ฐ ์ฃผ์†Œ
num (int) : ๋ฐ์ดํ„ฐ ์ˆ˜
return (list of int) : ์š”์ฒญ ๋œ ๋ฐ์ดํ„ฐ ๋ชฉ๋ก

*`app.fc04_read_input_registers (mbid, addr, num)`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜ ์ฝ”๋“œ 04 ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
mbid (int) : Modbus ID
addr (int) : ๋ฐ์ดํ„ฐ ์ฃผ์†Œ
num (int) : ๋ฐ์ดํ„ฐ ์ˆ˜
return (list of int) : ์š”์ฒญ ๋œ ๋ฐ์ดํ„ฐ ๋ชฉ๋ก

*`app.fc05_write_single_coil (mbid, addr, val)`์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜ ์ฝ”๋“œ 05 ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
mbid (int) : Modbus ID
addr (int) : ๋ฐ์ดํ„ฐ ์ฃผ์†Œ
val (int) : ๋ฐ์ดํ„ฐ ๊ฐ’
return (int) : ๋ฐ์ดํ„ฐ ์ˆ˜ (ํ•ญ์ƒ 1)

*`app.fc06_write_single_register (mbid, addr, val)`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜ ์ฝ”๋“œ 06 ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
mbid (int) : Modbus ID
addr (int) : ๋ฐ์ดํ„ฐ ์ฃผ์†Œ
val (int) : ๋ฐ์ดํ„ฐ ๊ฐ’
return (int) : ๋ฐ์ดํ„ฐ ์ˆ˜ (ํ•ญ์ƒ 1)

* 'app.fc15_write_multiple_coils (mbid, addr, vals)'๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜ ์ฝ”๋“œ 15 ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
mbid (int) : Modbus ID
addr (int) : ๋ฐ์ดํ„ฐ ์ฃผ์†Œ
vals (์ •์ˆ˜ ๋ชฉ๋ก) : ๋ฐ์ดํ„ฐ ๊ฐ’ ๋ชฉ๋ก
return (int) : ๋ฐ์ดํ„ฐ ์ˆ˜

*`app.fc16_write_multiple_registers (mbid, addr, vals)`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜ ์ฝ”๋“œ 16 ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
mbid (int) : Modbus ID
addr (int) : ๋ฐ์ดํ„ฐ ์ฃผ์†Œ
vals (์ •์ˆ˜ ๋ชฉ๋ก) : ๋ฐ์ดํ„ฐ ๊ฐ’ ๋ชฉ๋ก
return (int) : ๋ฐ์ดํ„ฐ ์ˆ˜

*`app.msg_out` ๋ฐ`app.msg_in`์„ ์‚ฌ์šฉํ•˜์—ฌ ์š”์ฒญ ๋ฐ ์‘๋‹ต ๋ฉ”์‹œ์ง€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

* ๋กœ๊ทธ ํŒŒ์ผ์„ ์ €์žฅ์†Œ์— ์ €์žฅํ•˜๋ ค๋ฉด`app.log_file (text)`๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
๋กœ๊ทธ ํŒŒ์ผ์€ [Storage Directory] / PyToolModbusTCP / log_ [UTC Timestamp] .txt์— ์žˆ์Šต๋‹ˆ๋‹ค.
text (str) : ํ…์ŠคํŠธ ๋‚ด์šฉ
return (str) : ์ „์ฒด ํŒŒ์ผ ๊ฒฝ๋กœ
์—…๋ฐ์ดํŠธ ๋‚ ์งœ
2021. 7. 6.

๋ฐ์ดํ„ฐ ๋ณด์•ˆ

๋ณด์•ˆ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ ๋ฐ ๊ณต์œ ํ•˜๋Š” ๋ฐฉ์‹์„ ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ์—์„œ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ๊ฐœ์ธ ์ •๋ณด ๋ณดํ˜ธ ๋ฐ ๋ณด์•ˆ ๊ด€ํ–‰์€ ์‚ฌ์šฉ์ž์˜ ์•ฑ ์‚ฌ์šฉ, ์ง€์—ญ, ์—ฐ๋ น์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ œ๊ณตํ•œ ์ •๋ณด์ด๋ฉฐ ์ถ”ํ›„ ์—…๋ฐ์ดํŠธ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ œ3์ž์™€ ๊ณต์œ ๋˜๋Š” ๋ฐ์ดํ„ฐ ์—†์Œ
๊ฐœ๋ฐœ์ž๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ณต์œ ๋ฅผ ์„ ์–ธํ•˜๋Š”์ง€ ์ž์„ธํžˆ ์•Œ์•„๋ณด์„ธ์š”.
์ˆ˜์ง‘๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
๊ฐœ๋ฐœ์ž๊ฐ€ ์–ด๋–ป๊ฒŒ ์ˆ˜์ง‘์„ ์„ ์–ธํ•˜๋Š”์ง€ ์ž์„ธํžˆ ์•Œ์•„๋ณด์„ธ์š”.

์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ

Version 0.4
Python version for the script is 3.8.
Now the script runs in Python global environment. Existing scripts should still work as before.
`app.version` is added for checking app version.

์•ฑ ์ง€์›

๊ฐœ๋ฐœ์ž ์†Œ๊ฐœ
Quan Lin
jacklinquan@gmail.com
190 Centre Dandenong Rd Cheltenham VIC 3192 Australia
undefined

Quan Lin์˜ ์•ฑ ๋”๋ณด๊ธฐ