iT邦幫忙

2021 iThome 鐵人賽

DAY 6
0

這段時間由於公司稍微忙一點,所以我就先把腦內的存稿一一先放出來,

軟體的實作過程等有空檔我再慢慢邊重作邊介紹出來。

1.Opcua是啥?

OPC UA的全名是 OPC Unified Architecture(OPC統一架構)。

OPC UA是OPC基金會應用在自動化技術的機器對機器網絡傳輸協議(節錄自wiki)。

簡單來說,OPC UA就是應用於工業放面的通訊協定,主要是微軟和一些傳統軟件解決

方案商主導的一個通訊格式,早期主要是出現在 Window相關的解決方案,過了一陣子

就有相關的開源版本。

2.簡單的建立連線

這邊主要是使用 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));
    ```

上一篇
【Day5】後端設定(前端的建立在晚一點)
下一篇
【Day7】使用Django 產生 excel報表
系列文
看一般人要怎樣使用 Python以及 Django開發一個過得去的應用12
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言