PDA

Просмотр полной версии : Опрос датчика по модбас



i`m
23.01.2019, 11:53
Здравствуйте уважаемые форумчане! Прошу Вашей помощи в реализации задачи, поскольку c CoDeSys 3.5 и СПК ОВЕН занимаюсь всего неделю, а решение необходимо к середине февраля.:(
По сути - есть СПК 110, три сигнальных модуля(MV110_8AS, MV110_32DN, MU110_32R) и 14 датчиков, опрашиваемые по модбас. Если с подключением модулей компания ОВЕН максимально упростило задачу пользователю, и я как будто сделал всё верно(к хардварной части доступа пока нет), то с опросом датчиков я нахожусь в весьма затруднительном положении. Безусловно не прошу Вас сделать всё за меня, но хотя бы не кодом - словами подскажите, подпните в нужном направлении.
К сообщению прикладываю архив со скелетом проекта и паспорт на датчик от производителя.
Уповаю на Вашу помощь.
P.S. Такой код будет работать?


PROGRAM com3
VAR
com_service_com3: ComService.COM_SERVICE; //ФБ настройки и открытия порта COM3
Settings_COM3: ComService.COM_Settings; //Структура настроек порта COM3
SettingsEX_COM3: ComService.COM_SettingsEx; //Структура расширенных настроек порта COM3

iDevice: INT; //Переменные начала цикла опроса (0-14)

DI_1: MB_RD_HOLD_REGS; // ФБ опроса датчика 1
DI_2: MB_RD_HOLD_REGS; // ФБ опроса датчика 2

abyDI_1_buffer: ARRAY[0..255] OF BYTE; //Буфер ФБ опроса датчика1
abyDI_1_data: ARRAY[0..255] OF BYTE; //Буфер данных, считанных с датчика1

abyDI_2_buffer: ARRAY[0..255] OF BYTE; //Буфер ФБ опроса датчика2
abyDI_2_data: ARRAY[0..255] OF BYTE; //Буфер данных, считанных с датчика2

rDI_1_input: REAL; //Показания датчика1
wsDI_1_input_status: WSTRING; // Статус измерения датчика1
rDI_2_input: REAL; //Показания датчика2
wsDI_2_input_status: WSTRING; // Статус измерения датчика2

_2WORD_TO_REAL: Word_Real; //Экземпляр объединения для преобразования двух WORD в REAL
END_VAR
VAR CONSTANT
abyEmptyBuffer: ARRAY [0..255] OF BYTE:=[255(0)]; // Пустой буфер
END_VAR



// [1] настраиваем COM-порт
Settings_COM3.sPort:=3;
Settings_COM3.byStopBits:=1;
Settings_COM3.byParity:=0;
Settings_COM3.ulBaudrate:=9600;
Settings_COM3.ulTimeout:=0;
Settings_COM3.ulBufferSize:=0;

SettingsEX_COM3.byByteSize:=8;

// [2] открываем COM-порт
COM_Service_COM3
(
Enable:=TRUE,
Settings:=Settings_COM3,
Sets_Ex:=SettingsEX_COM3,
Task:=OPEN_TSK,
);

// [3] iDevice определяет опрашиваемый датчик: 0 - DI1, 1 - DI2
CASE iDevice OF
0:
// запускаем ФБ опроса датчика1
DI_1
(
Enable:=COM_Service_COM3.Ready,
Mode:=MB_RTU,
DevAddr:=1,
FirstAddr:=18,
Quantity:=1,
ComHandle:=COM_Service_COM3.handle,
TimeOut:=T#500MS,
Buffer:=abyDI_1_buffer,
);

// если ФБ опроса датчика завершил работу...
IF DI_1.Complete // ФБ опроса датчика 1
THEN
// ...и ошибки отсутствуют, то забираем значения датчика
IF DI_1.Exception=0 THEN
abyDI_1_data:=abyDI_1_buffer;
rDI_1_input:=_2WORD_TO_REAL.rRealValue;
END_IF
// завершаем опрос датчика 1
DI_1(Enable:=FALSE, Buffer:=abyDI_1_buffer);

// переходим к опросу датчика 2
iDevice:=1;
// очищаем буфер датчика 2
abyDI_2_buffer:=abyEmptyBuffer;
END_IF

1:
// запускаем ФБ опроса датчика 2
DI_2
(
Enable:=COM_Service_COM3.Ready,
Mode:=MB_RTU,
DevAddr:=2,
FirstAddr:=18,
Quantity:=1,
ComHandle:=COM_Service_COM3.handle,
TimeOut:=T#500MS,
Buffer:=abyDI_2_buffer,
);

// [3.0.2] если ФБ опроса датчика завершил работу...
IF DI_2.Complete // ФБ опроса датчика 2
THEN
// ...и ошибки отсутствуют, то забираем значения датчика
IF DI_2.Exception=0 THEN
abyDI_2_data:=abyDI_2_buffer;
rDI_2_input:=_2WORD_TO_REAL.rRealValue;
END_IF
// завершаем опрос датчика 2
DI_2(Enable:=FALSE, Buffer:=abyDI_2_buffer);

// начинаем новый цикл опроса
iDevice:=0;
END_IF

END_CASE