文章目錄
VDCT 建立一個db文件
新建record
右鍵可以新建一個record,然後調整內部的各種參數
保存上面的建立的db文件爲simulate.db 文件##
生成後的db文件如下:
make一下,將其更新到db文件夾下
在ioc應用的最外一層進行make
查看是否更新到了db文件夾下
更新protocol文件
protocol文件的功能
主要是希望能夠實現兩個功能一個是讀功能,另一個是寫功能。其中getVol 和 getCur 都是從下面被控設備中,通過modbus協議獲取數據。SetVol 和SetCur 的作用則是對被控設備實現寫的功能。
修改protocol 文件
GetVol {
wait 2;
# out $1,0x05 0x03 0x01 0x04,"0.4R","%#<modbus>";
# in $1,0x05 0x03 0x01 0x04,"%0.4R","%#<modbus>";
OUT 05 03 01 04 ,"%0.4R", "%#<modbus>";
IN 05 03 01 04 ,"%0.4R", "%#<modbus>";
}
GetCur {
wait 2;
OUT 05 03 02 04 ,"%0.4R", "%#<modbus>";
IN 05 03 02 04 ,"%0.4R", "%#<modbus>";
}
SetVol {
wait 2;
# out $1,0x05 0x03 0x01 0x04,"0.4R","%#<modbus>";
# in $1,0x05 0x03 0x01 0x04,"%0.4R","%#<modbus>";
OUT 05 05 01 04 ,"%0.4R", "%#<modbus>";
IN 05 05 01 04 ,"%0.4R", "%#<modbus>";
}
SetCur {
wait 2;
OUT 05 05 02 04 ,"%0.4R", "%#<modbus>";
IN 05 05 02 04 ,"%0.4R", "%#<modbus>";
}
修改撰寫被控設備的模擬腳本
採用python編寫被控設備的模擬腳本,模擬腳本如下:
import socket
import struct
import crcmod
from dataservice.datawave_produce.waveproduce import sin_wave,triangle_wave
def crccreate(b,length):
crc16_func = crcmod.mkCrcFun(0x18005, initCrc=0xFFFF, rev=True, xorOut=0x0000)
return crc16_func(b[0:length])
def crccheckhole(b,length):
crc16_func = crcmod.mkCrcFun(0x18005, initCrc=0xFFFF, rev=True, xorOut=0x0000)
return hex(crc16_func(b[0:length]))==bytesToHex(b[length],b[length+1])
def crccheck(b,length):
print('傳過來的b,和lenght',b,' ',length)
crc16_func = crcmod.mkCrcFun(0x18005, initCrc=0xFFFF, rev=True, xorOut=0x0000)
return crc16_func(b[0:length]) == bytesToInt(b[length], b[length + 1])
def get_send_msgflowbytes(slave,func,register,length,data):
if length!=4:
pass
else:
# print('data',data)
a = struct.pack('!bbbbf', slave, func, register, length, data)
# print(len(a))
b=struct.pack('H',crccreate(a[0:8], length=8))
a=a + b
# print(a)
return a
if __name__=='__main__':
tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)#創建套接字
tcp_server_socket.bind(('192.168.127.201',9011))#綁定本機地址和接收端口
tcp_server_socket.setsockopt(socket.IPPROTO_TCP,socket.TCP_NODELAY,True)
print('Waiting connecting')
tcp_server_socket.listen(1)#監聽()內爲最大監聽值
client_socket,client_addr= tcp_server_socket.accept()#建立連接(accept(無參數)
print('Someone has connected to this sever')
xsin,ysin=sin_wave(0,6,0.1,2,2)
xtri,ytri=triangle_wave(0,6,0.1,2,2)
ysin=10*ysin
ytri=10*ytri
sinindex=0;
triindex=0;
while True:
b =client_socket.recv(10)
print('receiving msg:',b)
if b[1]==0x05:#05 功能碼 表示設定一個寄存器
slave,func,register,length,datafloat=struct.unpack('!bbbbf',b[0:8]) #解析傳過來的二進制字節流
print('we are receiving setting command',b,'the value is',datafloat)
client_socket.send(b)
elif b[2]==0x01: #正弦波產生函數
slave,func,register,length=struct.unpack('!bbbb',b[0:4]) #解析傳過來的二進制字節流
sinindex +=1
#此處的數據包格式由epics 的protocol文件所確定
msg = get_send_msgflowbytes(slave, func, register, length, ysin[sinindex]) #構建符合要求的數據包格式
print('sending msg:',msg)
# print(b)
client_socket.send(msg)
if sinindex==59:
sinindex=0
elif b[2]==0x02:#三角波產生函數
slave,func,register,length=struct.unpack('!bbbb',b[0:4]) #解析傳過來的二進制字節流
triindex +=1
#此處的數據包格式由epics 的protocol文件所確定
msg = get_send_msgflowbytes(slave, func, register, length, ytri[triindex]) #構建符合要求的數據包格式
print('sending msg:',msg)
# print(b)
client_socket.send(msg)
if triindex==59:
triindex=0
建立css文件
參考一下css 的入門
https://blog.csdn.net/weixin_42066185/article/details/106530508
添加數據監測部分(數據讀功能)
拖動一個xy-到文件上面
修改xy-屬性監測的pv名稱
數據功能監測(數據讀功能,兩個數據曲線放到一張座標軸上)
添加一個額外的tracer
將被監控的pv_name 填寫到pv value上
監控結果:
添加一個按鈕寫入數據功能(數據寫)
添加一個按鈕功能
拖動一個control 欄目中的一個按鈕到文本中
增加按鈕的一個執行動作
當點擊該按鈕的時候,寫如100.24 到給定的pv的上。
實驗驗證
數據讀功能正常
!
數據寫功能驗證
點擊寫功能按鈕,觀察被控腳本變化,收到