Для того, чтобы создать канал связи между контроллером и сервером Phyton, в можно использовать виртуальный контроллер (PLCSIM-Advanced), для этого понадобятся следующие программы:
Необходимо создать новый проект в программе TIA-Portal и назвать его, например, Phyton.
Далее добавить процессорный модуль. В Project tree (дерево проекта) двойным щелчком ЛКМ вызвать меню добавления новых модулей (рисунок 2). В этом проекте в роли процессора будет пользоваться модуль 1513-1 PN.
Если в вашем проекте потребуется добавление защищенных блоков, то при использовании блоков с защитой от несанкционированного доступа и моделирования их в программе S7-PLCSIM Advanced может быть выдана ошибка.
Если вы хотите смоделировать защищённый блок с помощью S7-PLCSIM Advanced, вы должны включить моделирование в свойствах блока перед настройкой защиты блока. В противном случае моделирование будет прервано с сообщением об ошибке.
Чтобы выполнить симуляцию для защищенного блока и библиотек, выполните следующие действия:
- Откройте блок, который защищен.
- В окне инспектора откройте «Свойства блока» и перейдите на вкладку «Компиляция».
- В разделе «Моделирование» вы можете посмотреть, можно ли смоделировать блок с помощью S7-PLCSIM Advanced. Необходимо установить флажок «Можно смоделировать с помощью S7-PLCSIM Advanced» (Рисунок 3).
Далее в проекте необходимо настроить сетевой интерфейс, для этого (Рисунок 4):
- Откройть «Конфигурацию устройства» Phyton;
- Перейти в свойства>> раздел «Ethernet-адреса»;
- Создайтm новую подсеть и установитm IP-адрес/маска подсети 192.168.0.1/255.255.255.0.
Так-как в проекте будет использоваться тактовый байт процессора, необходимо активировать тактовую память. Тактовый байт позволит нам создать модуляцию импульсов с частотой от 0.5 Hz до 10 Hz (Рисунок 5):
Для активации тактового байта необходимо перейти в настройки процессорного модуля и, в разделе General, в пункте System and clock memory, установить флажок на пункте<<Enable the use of clock memory byte>> и ввести адрес тактового байта например 1000 байт (рисунок 6).
Также в проекте понадобится база данных (BD). В ней будет храниться информация с отправленными и полученными сообщениями. Понадобятся четыре переменные: две переменные определённые как строки (string) отправка и получение в виде строк, и две переменные в виде массивов данных из 32 символов (отправка и получение в виде массивов 0..32 символов (Array)). Строковые переменные будем использовать для удобства их читаемости пользователем. Длину символов можно выбирать в зависимости от поставленных задач. Количество символов может принимать значение от 1 до 254.
Создадим базу данных и дадим ей имя Phyton (Рисунок 7):
Далее заполнить базу данных переменными:
Добавить 2 переменные типа Array для отправки и получения сообщений, и 2 переменные типа string для отправки и получения сообщений (Рисунок 8).
Далее создать нашу программу с среде разработки TIA-Portal.
Программа будет содержать несколько сетей (network) с инструкциями:
В Network 1 (transformation) будут преобразовываться переменные из строкового типа в символьный тип для отправляемых сообщений. И из символьного типа в строковый тип для получаемых сообщений (Рисунок 9).
TIA-Portal позволяет заполнять имена инструкций любо вручную, либо перетаскивания имени переменных сразу из меню <<Detalis view>> базы данных.
А так же понадобится присвоить тег выходу Cnt инструкции Strg_TO_Char. Можно добавить имя тега в таблицу тегов. Для этого необходимо в дереве проекта открыть вкладку PLC tags>Default tag table и добавить тег Count с типом данных Uint (Рисунок 10).
Так-же можно создать локальный тег. Для этого назначим имя тега выходу Cnt. Далее в выпадающем меню настроек блока Strg_TO_Char необходимо выбрать пункт Define tag, выбрать тип данных Uint и нажать кнопку Define. Таким образом, переменная с тегом count будет определена как локальная переменная.
Далее создать Network 2 (connect). Добавить в неё инструкцию TCON для запроса на подключение с абонентом. При добавлении блока будет предложено назначить ему экземплярный блок DB (Рисунок 11).
- Вход REQ инструкции TCON запускает задание по установлению соединения, указанного на восходящем фронте;
- Вход ID (АйДи абонента) Ссылка на назначенное соединение принимает диапазон значений: от W#16#0001 до W#16#0FFF;
- Вход Connect содержит базу данных для настроек сети
- Выход Done и Busy это параметр состояния подключения со следующими значениями: 0: задание еще не запущено или выполняется
- 1: задание выполнено без ошибок.
- Выход Error - параметр состояния ошибки: 0: Ошибка отсутствует
- 1: Произошла ошибка
- Выход Status - Статус инструкции отображающий код работы блока TCON. Информацию о статусах и их расшифровку можно найти в информационной системе TIA-Portal
Настроить подключение в блоке TCON (Рисунок 12.1, 12.2)
В строке Partner необходимо указать "Unspecified" для того чтобы можно было подключаться к любому серверу.
Адрес локального сервера и удаленного сервера настраивается индивидуально в зависимости от сети в которой работает сервер. В поля Connection ID установим значение "1". В поле ID можно ввести значения в диапазоне от 1 до 4095. Соответственно на одно подключение можно отправить до 4095 телеграмм.
Все настройки блока TCON дублируются в экземплярной DB, что позволяет сделать программу связи стандартной для подключения к разным серверам.
На данном этапе программа готова к подключению к серверу.
Если тегу "Start_Connect" задать значение "1"(видео 1) то на стороне сервера Phyton будет выведено сообщение о подключившемся клиенте (Рисунок 13).
Далее в PLC необходимо настроить блоки для приёма (Рисунок 14) и отправки (Рисунок 15) сообщений.
Инструкция TSEND будет инициировать отправку сообщений, когда на входе REQ будет установлен сигнал "1". На входе LEN установлено значение 32, т.к. отправляется 32 символа (для отправки большего количества символов необходимо увеличить это число). Для входа ID устанавливается такое-же значение как и в блоке TCON.
Инструкция TRCV будет периодически получать данные, Для этого на входе EN_R установлен тактовый бит с частотой 0.5Hz.
Пример работы программы отображен на видео 2.
Пример программы для phyton
import threading
import socket
import sys
# Функция для отправки данных
def SendMessage():
while True:
# Сохранение сообщения от пользователя
temp = input()
# Приводим сообщение к 16 байтам, заполняя конец строки пробелами
mess = temp + (16 - len(temp)) * ' '
# Отправка сообщения в клиентский сокет
client_socket.send(mess.encode())
print(f"[{mess}] message sent\n")
# Функция приема данных
def ReceiveMessage():
while True:
# Считываем 32 байт (символов) из сокета клиента.
mess = client_socket.recv(32).decode()
if not mess:
sys.exit(0)
print(f"Received message: {mess}\n")
# Основная программа
if __name__ == "__main__":
# Определение IP-адреса и порта сервера
SERVERIP = '192.168.0.10'
PORT = 2000
# Инициализация сокета TCP-сервера по протоколу IPv4 (AF_INT)
Server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Привязка IP-адреса к порту
Server.bind((SERVERIP, PORT))
# Запуск прослушивания в серверном сокете
Server.listen(1)
print(f'Server is listening on {SERVERIP} : {PORT}')
# Прием входящего соединения
client_socket, Addr = Server.accept()
print(f"{Addr} is connected. Type a message and press enter to send it.\n")
# Определение потока для каждой функции
ReceiveThread = threading.Thread(target=ReceiveMessage)
SendThread = threading.Thread(target=SendMessage)
SendThread.start()
ReceiveThread.start()
Ссылка на пример кода расположена на Qir-коде (рисунок 16-17).
В коде программы Phyton для корректной отправки и получения сообщений необходимой длины необходимо изменить количество символов приема-отправки в следующих строках:
mess = temp + (32 - len(temp)) * ' '
mess = client_socket.recv(32).decode()
Где число 32 отображает длину сообщения.
В строке SERVERIP = '192.168.0.10', необходимо либо ввести текущий сетевой адрес подключения, либо ввести localhost.
Сервер обмена сообщениями готов к работе.
Подведение итогов.
В этой статье был создан простой сервер для обмена сообщениями. Сервер на языке Phyton позволит связаться с любым клиентом, в зависимости от поставленных задач, сетях в которых работает сервер и др.