這段時間由於公司稍微忙一點,所以我就先把腦內的存稿一一先放出來,
軟體的實作過程等有空檔我再慢慢邊重作邊介紹出來。
OPC UA的全名是 OPC Unified Architecture(OPC統一架構)。
OPC UA是OPC基金會應用在自動化技術的機器對機器網絡傳輸協議(節錄自wiki)。
簡單來說,OPC UA就是應用於工業放面的通訊協定,主要是微軟和一些傳統軟件解決
方案商主導的一個通訊格式,早期主要是出現在 Window相關的解決方案,過了一陣子
就有相關的開源版本。
這邊主要是使用 Python 簡單的在樹梅派建立一個傳輸傳感器數據的本地 Server
主要是根據網路一個不知名的案例改成我自己需要的版本。
有興趣可以參考一下。
下面是 Server 端,在這邊只是簡單的模擬工廠的機台。
from opcua import ua,Server
from random import randint
import datetime
import time
import Adafruit_DHT
server =Server()
url ="opc.tcp://192.168.50.128:4840"
#需轉成自己server的ip
server.set_endpoint(url)
DHT_SENSOR = Adafruit_DHT.DHT11
DHT_PIN = 4
'''
security_policy = [
ua.SecurityPolicyType.NoSecurity,
]
server.set_security_policy(security_policy)
policyIDs = [
"Anonymous"
]
server.set_security_IDs(policyIDs)
'''
#server.set_security_policy([ua.)SecurityPolicyType.Basic256_SignAndEncrypt])
name ="OPCUA_SIMULATION_SERVER"
addspace =server.register_namespace(name)
node =server.get_objects_node()
Param =node.add_object(addspace,"Parameters")
Temp = Param.add_variable(addspace,"Temperature", 0)
Humid = Param.add_variable(addspace,"Humidity", 0)
Time = Param.add_variable(addspace,"Time" ,0)
Temp.set_writable()
Humid.set_writable()
Time.set_writable()
server.start()
print("Server started at {}".format(url))
while True:
Humidity, Temperature = Adafruit_DHT.read_retry(DHT_SENSOR, DHT_PIN)
TIME = datetime.datetime.now()
print("Temp={0:0.2f}*C Humidity={1:0.2f}%".format(Temperature, Humidity))
Temp.set_value(Temperature)
Humid.set_value(Humidity)
Time.set_value(TIME)
time.sleep(2)
另外的就是客戶端,這邊我是在django上面接收資料,不過接收的方式也是根據原本的python 程式碼版本修改的。
下面的是原本的版本。
from opcua import ua,Client
import time
url ="opc.tvp://192.168.1.52:4840"
client =Client(url)
'''
client.user_certificate = None
client.user_private_key = None
#client.set_security(client, None, None)
security_policy = [
ua.SecurityPolicyType.NoSecurity,
]
client.set_security(client, security_policy, None)
'''
#client.secure_channel_id = None
client.connect()
print("Client Connected")
while True:
Temp = client.get_node("ns=2;i=2")
Temperature = Temp.get_value()
print(Temperature)
Humid = client.get_node("ns=2;i=3")
Humidity = Humid.get_value()
print(Humidity)
TIME = client.get_node("ns=2;i=4")
TIME_value = TIME.get_value()
print(TIME_value)
time.sleep(1)
放入 Django Views的版本就大概節錄一下
def getCollectorData(request):
MachineData={
'DeviceId': 1,
'DeviceName':'1,
'Status': random.randint(0,1), #設備運行狀態
'OverheadFlow':random.randint(1,10) ,#'頂流量',
'Power': random.randint(10000,100000), #功率
#中間跳過 這邊只是簡單的初始化,其實沒啥必要
'totalGoodProductionNumber':random.randint(1,10), #'生產良品總數'
}
#url ="opc.tcp://192.168.3.221:4840"
client =Client('opc.tcp://192.168.3.221:4840')
client.connect()
node_Oil_Temp_Current_Val = client.get_node("ns=1;i=1336")
val_Oil_Temp_Current_Val = node_Oil_Temp_Current_Val.get_value()
MachineData['Oil_Temp_Current_Val']= val_Oil_Temp_Current_Val
#中間跳過 大致上跟上面的結構沒啥差異
totalGoodProductionNumber = client.get_node("ns=1;i=1323")
totalGoodProductionNumber = totalGoodProductionNumber.get_value()
MachineData['totalGoodProductionNumber']= totalGoodProductionNumber
client.disconnect()
Collector={
'CollectorId': 1,
'CollectorName':'1#采集器',
'Status': 0,
'DeviceList':[MachineData],
}
#新增一筆記錄
totalProductionNumber=MachineData['totalProductionNumber'],
OilTempCurrentValPhase1=MachineData['OilTempCurrentValPhase1'],
#中間跳過
totalGoodProductionNumber=MachineData['totalGoodProductionNumber'])
unit.save() #寫入資料庫
return HttpResponse( json.dumps(Collector));
```