48 lines
1.5 KiB
Python
48 lines
1.5 KiB
Python
import struct
|
|
import time
|
|
import threading
|
|
from pymodbus.client import ModbusTcpClient
|
|
from flask import Flask, jsonify
|
|
|
|
app = Flask(__name__)
|
|
|
|
modbus_data = {'rpm': 0, 'ai': 0, 'analog': 0} # 全域變數儲存資料
|
|
|
|
def read_modbus_data():
|
|
client = ModbusTcpClient(host="169.254.11.130", port=502)
|
|
if client.connect():
|
|
result = client.read_holding_registers(address=1633, count=6, slave=255)
|
|
client.close()
|
|
if result.isError():
|
|
return {'rpm': 'Error', 'ai': 'Error', 'analog': 'Error'}
|
|
else:
|
|
regs = result.registers
|
|
def to_float32(low, high):
|
|
return struct.unpack('<f', struct.pack('<HH', low, high))[0]
|
|
return {
|
|
'rpm': to_float32(regs[0], regs[1]),
|
|
'ai': to_float32(regs[2], regs[3]),
|
|
'analog': to_float32(regs[4], regs[5]),
|
|
}
|
|
else:
|
|
return {'rpm': 'Disconnected', 'ai': 'Disconnected', 'analog': 'Disconnected'}
|
|
|
|
def polling_loop():
|
|
global modbus_data
|
|
while True:
|
|
modbus_data = read_modbus_data()
|
|
print(modbus_data) # ✅ 持續印出
|
|
time.sleep(0.5)
|
|
|
|
@app.route("/")
|
|
def index():
|
|
return "✅ Flask is running. Visit /modbus to get data."
|
|
|
|
@app.route("/modbus")
|
|
def get_data():
|
|
return jsonify(modbus_data)
|
|
|
|
if __name__ == "__main__":
|
|
threading.Thread(target=polling_loop, daemon=True).start() # ✅ 背景輪詢
|
|
app.run(host='127.0.0.1', port=5000, debug=True)
|