Просмотр полной версии : Настройка связи старой СПК207 с WinCC
SatanaXIII
19.04.2024, 10:47
Здравствуйте. Имеется контроллер СПК207 с подключенными по модбасу модулями МВ110-224.8А. Требуется вывести показания с этих модулей на визуализацию WinCC.
Сама СПК207-220.03.00.CS-WEB 2013 года выпуска. Версия:OWEN-20120817-2531 plc240web. Модули тех же годов (старая серия).
В Codesys v3.5 SP5 Patch5 создаю новый стандартный проект, выбираю там мою модель СПК, добавляю пустую визуализацию. По умолчанию таргет 3.5.4.26 не подходит, меняю его на Owen spc2xx-03.cs-web 3.5.0.40.
Для связи с модулями добавляю устройство Modbus COM 3.4.0.0, в него добавляю Modbus Master COM Port 3.4.0.0, в него уже свои модули Modbus Slave COM Port 3.4.0.0.
Для связи с WinCC добавляю устройство Ethernet 3.4.2.0, в которое добавляю ModbusTCP Slave Device 3.4.1.10.
Настройка самих устройств сейчас не важна, поскольку что с ними, что без них проект в контроллер загружается, но с двумя ошибками:
[ERROR] iodrvmodbus, 3.5.4.0 (3s - smart software solutions gmbh): Менеджер библиотек: Невозможно открыть библиотеку '#IoDrvModbusBase'. (Причина: Невозможно разрешить библиотеку заполнителя 'IoDrvModbusBase'.)
[ERROR] iodrvmodbus, 3.5.4.0 (3s - smart software solutions gmbh): Менеджер библиотек: Невозможно открыть библиотеку '#CAA Device Diagnosis'. (Причина: Невозможно разрешить библиотеку заполнителя 'CAA Device Diagnosis'.)
Добавляю в проект вручную требуемые библиотеки, но связь с модулями, ровно как и с WinCC не появляется.
75280
Евгений Кислов
19.04.2024, 11:00
Добрый день.
Свяжитесь, пожалуйста, со мной по телеграм (ссылка в подписи) и подготовьте доступ по AnyDesk.
SatanaXIII
07.05.2024, 16:12
Значит, после добавления в проект библиотек ComService_3.1.0.compiled-library и Modbus(3.1.0).compiled-library, с последующей настройкой проекта как указано в пункте 5.4 мануала SPK_Modbus_v.1.1.pdf связь с аналоговыми модулями появилась.
Но только по порту COM2. При подключении модулей по порту COM3 опроса не происходит.
В чем может быть причина?
В общем виде код программы работы с модбасом выглядит так:
PROGRAM COM2
VAR
COM_Service_COM2: COM_SERVICE; // ФБ настройки и открытия порта COM2
MV110_8A: MB_RD_HOLD_REGS; // ФБ опроса модуля МВ110-8А
abyBuffer: ARRAY [0..255] OF BYTE; // Буфер ФБ опроса модуля МВ110-8А
abyMV110_8A_data: ARRAY [0..255] OF BYTE; // Буфер данных, считанных с модуля МВ110-8А
MV110_8A_1_InputsArr: ARRAY [0..7] OF REAL; // Показание входа модуля МВ110-8А
MV110_8A_1_InputsStatusArr: ARRAY [0..7] OF WORD; // Код ошибки измерения входа
MV110_8A_1_InputsStatusTextArr: ARRAY [0..7] OF WSTRING; // Cтатус измерения входа
_2WORD_TO_REAL: Word_Real; // Экземпляр объединия для преобразования двух WORD в REAL
InputsCounter: INT;
NumCurrModule: INT;
END_VAR
VAR CONSTANT
InputsShift: INT := 12; // Из мануала к модулю
EmptyRealInputsArr: ARRAY [0..7] OF REAL := [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0];
END_VAR
COM_Service_COM2
(
Enable := TRUE,
Task := OPEN_TSK,
);
COM_Service_COM2.Settings.sPort := 3;
COM_Service_COM2.Settings.byStopBits := 1;
COM_Service_COM2.Settings.byParity := 0;
COM_Service_COM2.Settings.ulBaudrate := 9600;
COM_Service_COM2.Settings.ulTimeout := 0;
COM_Service_COM2.Settings.ulBufferSize := 0;
COM_Service_COM2.sets_ex.byByteSize := 8;
MV110_8A
(
Enable := COM_Service_COM2.Ready,
Mode := MB_RTU,
DevAddr := 1,
FirstAddr := 2,
Quantity := 45,
ComHandle := COM_Service_COM2.handle,
TimeOut := T#1000MS,
Buffer := abyBuffer,
);
IF MV110_8A.Complete THEN
IF MV110_8A.Exception = 0 THEN
abyMV110_8A_data := abyBuffer;
FOR InputsCounter := 0 TO 7 DO
MV110_8A_1_InputsStatusArr[InputsCounter] := BYTE_TO_WORD(abyMV110_8A_data[1 + InputsCounter * InputsShift]) OR SHL(BYTE_TO_WORD(abyMV110_8A_data[0 + InputsCounter * InputsShift]),8);
MV110_8A_1_InputsStatusTextArr[InputsCounter] := Mx110Assistant.MvStatusToWstring(MV110_8A_1_Inputs StatusArr[InputsCounter]);
IF MV110_8A_1_InputsStatusArr[InputsCounter] = 0 THEN
_2WORD_TO_REAL.abyBytes[3] := abyMV110_8A_data[4 + InputsCounter * InputsShift];
_2WORD_TO_REAL.abyBytes[2] := abyMV110_8A_data[5 + InputsCounter * InputsShift];
_2WORD_TO_REAL.abyBytes[1] := abyMV110_8A_data[6 + InputsCounter * InputsShift];
_2WORD_TO_REAL.abyBytes[0] := abyMV110_8A_data[7 + InputsCounter * InputsShift];
MV110_8A_1_InputsArr[InputsCounter] := _2WORD_TO_REAL.rReal;
ELSE
MV110_8A_1_InputsArr[InputsCounter] := 0.0;
END_IF
END_FOR;
END_IF
MV110_8A(Enable := FALSE, Buffer := abyBuffer);
END_IF
Евгений Кислов
07.05.2024, 16:47
Значит, после добавления в проект библиотек ComService_3.1.0.compiled-library и Modbus(3.1.0).compiled-library, с последующей настройкой проекта как указано в пункте 5.4 мануала SPK_Modbus_v.1.1.pdf связь с аналоговыми модулями появилась.
Но только по порту COM2. При подключении модулей по порту COM3 опроса не происходит.
В чем может быть причина?
В общем виде код программы работы с модбасом выглядит так:
PROGRAM COM2
VAR
COM_Service_COM2: COM_SERVICE; // ФБ настройки и открытия порта COM2
MV110_8A: MB_RD_HOLD_REGS; // ФБ опроса модуля МВ110-8А
abyBuffer: ARRAY [0..255] OF BYTE; // Буфер ФБ опроса модуля МВ110-8А
abyMV110_8A_data: ARRAY [0..255] OF BYTE; // Буфер данных, считанных с модуля МВ110-8А
MV110_8A_1_InputsArr: ARRAY [0..7] OF REAL; // Показание входа модуля МВ110-8А
MV110_8A_1_InputsStatusArr: ARRAY [0..7] OF WORD; // Код ошибки измерения входа
MV110_8A_1_InputsStatusTextArr: ARRAY [0..7] OF WSTRING; // Cтатус измерения входа
_2WORD_TO_REAL: Word_Real; // Экземпляр объединия для преобразования двух WORD в REAL
InputsCounter: INT;
NumCurrModule: INT;
END_VAR
VAR CONSTANT
InputsShift: INT := 12; // Из мануала к модулю
EmptyRealInputsArr: ARRAY [0..7] OF REAL := [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0];
END_VAR
COM_Service_COM2
(
Enable := TRUE,
Task := OPEN_TSK,
);
COM_Service_COM2.Settings.sPort := 3;
COM_Service_COM2.Settings.byStopBits := 1;
COM_Service_COM2.Settings.byParity := 0;
COM_Service_COM2.Settings.ulBaudrate := 9600;
COM_Service_COM2.Settings.ulTimeout := 0;
COM_Service_COM2.Settings.ulBufferSize := 0;
COM_Service_COM2.sets_ex.byByteSize := 8;
MV110_8A
(
Enable := COM_Service_COM2.Ready,
Mode := MB_RTU,
DevAddr := 1,
FirstAddr := 2,
Quantity := 45,
ComHandle := COM_Service_COM2.handle,
TimeOut := T#1000MS,
Buffer := abyBuffer,
);
IF MV110_8A.Complete THEN
IF MV110_8A.Exception = 0 THEN
abyMV110_8A_data := abyBuffer;
FOR InputsCounter := 0 TO 7 DO
MV110_8A_1_InputsStatusArr[InputsCounter] := BYTE_TO_WORD(abyMV110_8A_data[1 + InputsCounter * InputsShift]) OR SHL(BYTE_TO_WORD(abyMV110_8A_data[0 + InputsCounter * InputsShift]),8);
MV110_8A_1_InputsStatusTextArr[InputsCounter] := Mx110Assistant.MvStatusToWstring(MV110_8A_1_Inputs StatusArr[InputsCounter]);
IF MV110_8A_1_InputsStatusArr[InputsCounter] = 0 THEN
_2WORD_TO_REAL.abyBytes[3] := abyMV110_8A_data[4 + InputsCounter * InputsShift];
_2WORD_TO_REAL.abyBytes[2] := abyMV110_8A_data[5 + InputsCounter * InputsShift];
_2WORD_TO_REAL.abyBytes[1] := abyMV110_8A_data[6 + InputsCounter * InputsShift];
_2WORD_TO_REAL.abyBytes[0] := abyMV110_8A_data[7 + InputsCounter * InputsShift];
MV110_8A_1_InputsArr[InputsCounter] := _2WORD_TO_REAL.rReal;
ELSE
MV110_8A_1_InputsArr[InputsCounter] := 0.0;
END_IF
END_FOR;
END_IF
MV110_8A(Enable := FALSE, Buffer := abyBuffer);
END_IF
Добрый день.
Вы портом COM2 называете тот, который на корпусе прибора гравируется как COM2 или тот, которому в CODESYS соответствует ID = 2?
SatanaXIII
07.05.2024, 16:51
Вы портом COM2 называете тот, который на корпусе прибора гравируется как COM2 или тот, которому в CODESYS соответствует ID = 2?
На корпусе прибора.
При подключении модуля к порту с надписью на корпусе COM2, в программе я указываю ID=3.
При подключении модуля к порту с надписью на корпусе COM3, в программе я указываю ID=4
Евгений Кислов
07.05.2024, 16:53
На корпусе прибора.
При подключении модуля к порту с надписью на корпусе COM2, в программе я указываю ID=3.
При подключении модуля к порту с надписью на корпусе COM3, в программе я указываю ID=4
Для тестирования вы используете один и тот же код, меняя в нем номер порта?
SatanaXIII
07.05.2024, 16:55
Для тестирования вы используете один и тот же код, меняя в нем номер порта?
Нет. В проекте две программы, обрабатываемые двумя своими задачами. Код в них одинаковый. За исключением номера порта.
Удалил из программы вообще обработку COM2. Оставил только одну программу. Меняю в ней ID с 3 на 4 и ничего не происходит. При ID=3 связь есть, при ID=4 отсутствует.
Но намек понял. Погляжу еще завтра с утра.
Евгений Кислов
07.05.2024, 18:16
Если потребуется - свяжитесь со мной по телеграм (в подписи).
Powered by vBulletin® Version 4.2.3 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot