Ниже я приведу пример собственной реализации простой SCADA-программы, выполненной, как обычно говорят, «на коленке».
Была поставлена задача следить за дизель-генератором.
Необходимо вести журнал с указанием почасовых параметров, таких как: уровень топлива, давление масла, температура, заряд аккумулятора, токи, напряжения, часы работы.
Генератор находился в полукилометре от офиса и со временем такие прогулки стали вызывать стресс, особенно в плохую погоду.
Как оказалось, в генераторе установлен контроллер, поддерживающий протокол обмена Modbus RTU, а это значит, что можно проложить витую пару и подключиться по RS-485. Изучив адресную таблицу, мы решили сделать простую программу самостоятельно.
Результатом стал ScadaPy. Модбус TCP Интерфейс обмена.
Сначала подключаем библиотеку modbus.
Создаем ссылку на объект, к которому подключаемся и указываем: хозяин ="IP-адрес устройства, с которым устанавливаем соединение" порт = «порт устройства, к которому мы подключаемся»import modbus_tk import modbus_tk.defines as cst import modbus_tk.modbus_tcp as modbus_tcp
master = modbus_tcp.TcpMaster(host=slaveIP, port=int(slavePort))
master.set_timeout(1.0)
Теперь пытаемся получить данные от устройства, в этом случае, начиная с адреса регистра 0, мы получаем 10 регистров дискретных сигналов (DS).
getDI=master.execute(1, cst.READ_DISCRETE_INPUTS, 0, 10)
Для других типов регистров необходимо указывать другие имена.
master.execute(1,сst.READ_COILS, 0, 10)
master.execute(1,cst.READ_INPUT_REGISTERS, 100, 3)
master.execute(1,cst.READ_HOLDING_REGISTERS, 100, 12)
Теперь, если вы это сделаете: print getDi
Мы получим массив данных от устройства от адреса 0 до адреса 9. (0,1,0,1,0,0,0,0,0)
Если появляется что-то подобное, это означает, что устройство подключено.
Получение данных из других типов регистров происходит аналогично.
Формирование окна программы Подключаем библиотеку.
from Tkinter import *
Создайте ссылку на объект (окно).
root = Tk()
Установите фоновое изображение окна.
im = PhotoImage(file=backGroundPath)
Создайте объект холста.
canv = Canvas(root,width=1900,height=950,bg="black",bd=0, highlightthickness=0, relief='ridge')
Поместите его в окно.
canv.place(x=0, y=25)
Отображаем фон.
canv.create_image(1, 1,anchor=NW, image=im)
Начнем цикл.
root.mainloop()
Функция опроса
Для того, чтобы постоянно опрашивать устройства по протоколу modbusTCP, в tkinter есть методы after и mainloop, но сначала нужно создать процедуру jobModbusTCP. def jobModbusTCP():
getDI=master.execute(1, cst.READ_DISCRETE_INPUTS, 0, 10)
if(int(getDI[0]) == 1):
canv.itemconfig(diFig1,fill='red')
if(int(getDI[0]) == 0):
canv.itemconfig(diFig1,fill='green')
if(int(getDI[1]) == 1):
canv.itemconfig(diFig2,fill='red')
if(int(getDI[1]) == 0):
canv.itemconfig(diFig2,fill='green')
root.after(1000, jobModbusTCP)
Программный код
Ниже приведен код программы, отображающий состояние регистров [0] и [1], если логическое состояние регистра 0, то квадрат на холсте будет зеленым, если логическое состояние 1, то красным.
from Tkinter import *
import modbus_tk
import modbus_tk.defines as cst
import modbus_tk.modbus_tcp as modbus_tcp
import math
def jobModbusTCP():
getDI=master.execute(1, cst.READ_DISCRETE_INPUTS, 0, 10)
if(int(getDI[0]) == 1):
canv.itemconfig(diFig1,fill='red')
if(int(getDI[0]) == 0):
canv.itemconfig(diFig1,fill='green')
if(int(getDI[1]) == 1):
canv.itemconfig(diFig2,fill='red')
if(int(getDI[1]) == 0):
canv.itemconfig(diFig2,fill='green')
root.after(1000, jobModbusTCP)
master = modbus_tcp.TcpMaster(host='192.168.0.1', port=502)
master.set_timeout(1.0)
root = Tk()
im = PhotoImage(file='bg.gif')
canv = Canvas(root,width=1900,height=950,bg="black",bd=0, highlightthickness=0, relief='ridge')
canv.place(x=0, y=25)
canv.create_image(1, 1,anchor=NW, image=im)
diFig1=canv.create_rectangle(10,10,30,30,fill='gray', outline='black')
diFig2=canv.create_oval(50,50,80,80,fill='gray', outline='black')
root.after(1, jobModbusTCP)
root.mainloop()
Теперь раз в секунду программа будет отправлять запрос устройству и отображать ответ на мнемосхеме.
Вы можете увидеть больше примеров Здесь .
Теги: #python 2.7 #python
-
3 Типа Пользователей В Windows 7
19 Oct, 24 -
Что Такое Совок?
19 Oct, 24 -
Упадок Текста И Возрождение Визуального
19 Oct, 24 -
Проблема С Придворными.
19 Oct, 24 -
Индикатор Canvas — Альтернатива Ajaxload.gif
19 Oct, 24 -
Стихи Про Нетбук
19 Oct, 24 -
Интересное В Рунете
19 Oct, 24