Commit message
This commit is contained in:
parent
7dd3ae2aee
commit
54f0939119
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
31
README.md
31
README.md
|
@ -1,3 +1,30 @@
|
||||||
# sampyo-rs232
|
# 이 코드 템플릿은 SDT Cloud 환경에서 mqtt 메세지를 발행하는 코드입니다.
|
||||||
|
|
||||||
Your repository description
|
# 패키지 설치
|
||||||
|
- 코드는 sdtcloudpubsub 패키지를 사용합니다. 아래 명령어로 패키지를 다운로드 해야합니다.
|
||||||
|
```bash
|
||||||
|
$ pip install sdtcloudpubsub
|
||||||
|
```
|
||||||
|
|
||||||
|
# 코드 작성
|
||||||
|
- 코드는 runAction 함수에서 동작하고자 하는 기능을 작성합니다.
|
||||||
|
- msg 변수는 발행될 메세지 입니다.
|
||||||
|
- sdtcloudpubsub의 pubMessage 함수는 발행할 메세지 내용인 dictionary 타입 변수를 입력 받아 처리합니다.
|
||||||
|
|
||||||
|
# 메세지 발행
|
||||||
|
- 다음 변수로 메세지를 발행하는 코드를 작성하면...
|
||||||
|
```bash
|
||||||
|
msg = {
|
||||||
|
"message": "Hello World"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
- 실제로 발행되는 메세지은 다음과 같습니다.
|
||||||
|
```bash
|
||||||
|
msg = {
|
||||||
|
"data": {
|
||||||
|
"message": "Hello World"
|
||||||
|
},
|
||||||
|
"timestamp": 12312311...
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"modbus-server": {
|
||||||
|
"address": "25.7.55.237",
|
||||||
|
"port": 5020
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
version: bwc/v2 # bwc 버전 정보입니다.
|
||||||
|
spec:
|
||||||
|
appName: sampyo-rs232-app # 앱의 이름입니다.
|
||||||
|
runFile: main.py # 앱의 실행 파일입니다.
|
||||||
|
env:
|
||||||
|
bin: python3 # 앱을 실행할 바이너라 파일 종류입니다.(장비에 따라 다르므로 확인 후 정의해야 합니다.)
|
||||||
|
virtualEnv: base # 사용할 가상환경 이름입니다.
|
||||||
|
package: requirements.txt # 설치할 Python 패키지 정보 파일입니다.(기본 값은 requirement.txt 입니다.)
|
||||||
|
stackbase:
|
||||||
|
tagName: v0.0.1 # Stackbase(gitea)에 릴리즈 태그명 입니다.
|
||||||
|
repoName: sampyo-rs232 # Stackbase(gitea)에 저장될 저장소 이릅니다.
|
|
@ -0,0 +1,11 @@
|
||||||
|
version: bwc/v2 # bwc 버전 정보입니다.
|
||||||
|
spec:
|
||||||
|
appName: base-app # 앱의 이름입니다.
|
||||||
|
runFile: main.py # 앱의 실행 파일입니다.
|
||||||
|
env:
|
||||||
|
bin: python3 # 앱을 실행할 바이너라 파일 종류입니다.(장비에 따라 다르므로 확인 후 정의해야 합니다.)
|
||||||
|
virtualEnv: base # 사용할 가상환경 이름입니다.
|
||||||
|
package: requirements.txt # 설치할 Python 패키지 정보 파일입니다.(기본 값은 requirement.txt 입니다.)
|
||||||
|
stackbase:
|
||||||
|
tagName: v0.0.1 # Stackbase(gitea)에 릴리즈 태그명 입니다.
|
||||||
|
repoName: base-template # Stackbase(gitea)에 저장될 저장소 이릅니다.
|
|
@ -0,0 +1,102 @@
|
||||||
|
import signal, sys, time, os
|
||||||
|
import serial
|
||||||
|
import asyncio
|
||||||
|
from pymodbus.server.async_io import ModbusTcpServer
|
||||||
|
from pymodbus.datastore import ModbusSequentialDataBlock
|
||||||
|
from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext
|
||||||
|
import argparse
|
||||||
|
|
||||||
|
async def measurement_weight(port, data):
|
||||||
|
command_hex = '4430314B570D0A'
|
||||||
|
command_bytes = bytes.fromhex(command_hex)
|
||||||
|
|
||||||
|
while True:
|
||||||
|
try:
|
||||||
|
port.write(command_bytes)
|
||||||
|
time.sleep(0.02)
|
||||||
|
result = port.readline()
|
||||||
|
result = str(result, 'utf-8')
|
||||||
|
result = result.replace(' ', '')
|
||||||
|
result = float(result.replace('\r\n', ''))
|
||||||
|
result *= 1000
|
||||||
|
|
||||||
|
print(result)
|
||||||
|
|
||||||
|
if result < 0.0:
|
||||||
|
result = 0.0
|
||||||
|
|
||||||
|
data.setValues(3, 1, [int(result)])
|
||||||
|
except Exception as e:
|
||||||
|
print(f'measurement_weight: \n{e}')
|
||||||
|
pass
|
||||||
|
|
||||||
|
await asyncio.sleep(1)
|
||||||
|
|
||||||
|
async def set_zero(port, data):
|
||||||
|
command_hex = '4430314B5A0D0A'
|
||||||
|
command_bytes = bytes.fromhex(command_hex)
|
||||||
|
|
||||||
|
while True:
|
||||||
|
try:
|
||||||
|
val = data.getValues(1, 1, count=1)
|
||||||
|
|
||||||
|
if val[0] == 1:
|
||||||
|
port.write(command_bytes)
|
||||||
|
result = port.readline()
|
||||||
|
data.setValues(1, 1, [0])
|
||||||
|
else:
|
||||||
|
print(f'set_zero: \n{e}')
|
||||||
|
pass
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
await asyncio.sleep(1)
|
||||||
|
|
||||||
|
def exit_handler(signum, frame):
|
||||||
|
print('Stop')
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
async def run_server(port, data):
|
||||||
|
# TCP 서버 시작
|
||||||
|
server = ModbusTcpServer(context, address=("25.7.55.237", 5020))
|
||||||
|
|
||||||
|
update_coil_task = asyncio.create_task(measurement_weight(port=port, data=data))
|
||||||
|
update_hr_task = asyncio.create_task(set_zero(port=port, data=data))
|
||||||
|
|
||||||
|
await server.serve_forever()
|
||||||
|
await asyncio.gather(update_coil_task, update_hr_task)
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
parser = argparse.ArgumentParser()
|
||||||
|
parser.add_argument('-app',help='')
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
ROOT_PATH = f'/usr/local/sdt/app/{args.app}'
|
||||||
|
|
||||||
|
# Define serial port
|
||||||
|
serial_port = serial.Serial('/dev/ttyMAX1', 115200, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout=1)
|
||||||
|
|
||||||
|
# For detect Ctrl+C
|
||||||
|
signal.signal(signal.SIGINT, exit_handler)
|
||||||
|
|
||||||
|
# Create ModbusTCP server
|
||||||
|
store = ModbusSlaveContext(
|
||||||
|
co=ModbusSequentialDataBlock(0, [0] * 100), # Coils
|
||||||
|
hr=ModbusSequentialDataBlock(0, [0] * 100) # Holding Registers
|
||||||
|
)
|
||||||
|
|
||||||
|
context = ModbusServerContext(slaves=store, single=True)
|
||||||
|
loop = asyncio.get_event_loop()
|
||||||
|
loop.run_until_complete(run_server(port=serial_port, data=store))
|
||||||
|
|
||||||
|
# while True:
|
||||||
|
# start = time.time()
|
||||||
|
# measurement_weight(port=serial_port, data=store)
|
||||||
|
# print(registers[0])
|
||||||
|
|
||||||
|
# end = time.time()
|
||||||
|
|
||||||
|
# diff = end - start
|
||||||
|
|
||||||
|
# if diff < 1:
|
||||||
|
# time.sleep(1 - diff)
|
|
@ -0,0 +1,6 @@
|
||||||
|
# Write package's name that need your app.
|
||||||
|
#awsiotsdk
|
||||||
|
#pyyaml
|
||||||
|
#sdtcloudpubsub
|
||||||
|
pyserial
|
||||||
|
pymodbus
|
Loading…
Reference in New Issue