вы не эту ли функцию имели ввиду для проверки размера файла SysFileGetSize?
Вид для печати
Здравствуйте. Программирую на языке CFC. Возник вопрос по поводу типов переменных, а точнее date_and_time. Как сконвертировать переменную такого типа в текстовый формат, для отображения в таблице или текстовом поле? Переменную такого формата снимаю с выхода функционального блока RTC.
Вложение 22275
И вопрос по смс-оповещениям. Какие функциональные блоки надо использовать, чтобы работать с GSM-модемом ПМ01? Если их нет в стандартных библиотеках, то подскажите, пожалуйста, где их скачать.
Евгений Кислов, спасибо, получилось.:)
В визуализации мне необходимо вести статистику по датам и времени в таблице. Как правильно задать массив и его тип, чтобы записать текущее время и дату в ячейки? Таблица состоит из двух столбцов. В первом хочу записать время с датой, а во втором другая измеряемая величина. И так последовательно заполнять таблицу.
Надо конвертировать полученные данные dtu.dtsplit или как-то по-другому работать с date_and_time?
Евгений Кислов, а куда надо вставлять код функционирования таблицы? Переменные я прописала в VAR. Я делаю в codesys 3.5 sp5 на CFC, а проект в примере сделан в sp6.
Вот как выглядит проект у меня:
Вложение 22287
А там вот так:
Вложение 22289
Где найти такое поле, куда ввести оставшийся код?
Попробовала создать действие act в текущей программе plc_prg и там на ST написать текст программы для таблицы. Потом добавила функциональный блок с этим действием.
Получилось следующее:
Вложение 22311
Но при компиляции выдаёт следующие ошибки и ругается на delete.
Вложение 22313
Исправила, теперь ругается только лишь на delete. В чём может быть проблема?
Вложение 22317 Вот архив проекта
Спасибо, получилось. Единственное, что в таблицу программа всегда заносит одну и ту же стандартную дату с 70-м годом. Как это можно исправить? Второй столбец заполняется правильно.
Вот изменённый архив: Вложение 22321
1. Удалите из CFC программы блок считывания времени. Т.е. в итоге у вас в CFC программе останется один блок - вызов действия ACT.
2. Для MainTask поставьте время цикла t#100ms, для VISU_TASK - t#200ms.
Я, на всякий случай, прокомментирую использование DELETE - это было сделано в примере для его упрощения. В реальных проектах разумнее вырезать из времени разряды с помощью DTsplit, конвертировать их в STRING'и и склеивать функцией CONCAT в строку с нужным форматированием даты-времени.
Здравствуйте! Что-то с подсветкой на СПК207 у меня ничего не выходит... Делаю так
Код:
и ничего не происходит. Попробовал через блок Brightness с тем же результатом... Не подскажете где я ошибся?
Возможно, вопрос не относится к этой ветке, но темы в других местах остались без ответа.
Имеется среда CODESYS V.3.4, ПЛК МОДУС 5684 с интерфейсным модулем 5672, с помощью которого ПЛК (мастер) по ModBus опрашивает ПЧ (слейв).
Проблема заключается в том, что ПЛК не видит частотник, хотя видит и общается с другими слейв-устройствами. Также запускал программу ModbusPoll, она регистры ПЧ видит. Возможно, в программе ПЛК формируется неправильный modbus-запрос к частотнику? Можно ли это проверить?
Ссылка на мою тему с описанием проблемы и проектом: http://www.owen.ru/forum/showthread.php?t=22964
Может, тут подскажете... как такое лечить? При использовании библиотеки ArchiverSPK Вложение 22521 SP5 Patch 5, библиотека устанавливается с ошибками и из репозитория СПК и отдельно. Ошибка: Вложение 22523
Господа, возникло 2 вопроса. Как можно повернуть элемент, изображение на мнемосхеме на 90 градусов для 'красоты'. И еще как реализовать открытие/закрытие к примеру 6 клапанов с подтверждением типа да/нет. Надо создавать диалог на каждый клапан?
Не обязательно. Была у меня такая задача.Цитата:
И еще как реализовать открытие/закрытие к примеру 6 клапанов с подтверждением типа да/нет. Надо создавать диалог на каждый клапан?
Создаём диалог с параметрами имяКлапана, идКлапана:
Вложение 22649
Имя отображаем в строке. ИД используем для передачи в функцию открывания/закрывания клапанов. После вызова функции закрываем диалог.
Вложение 22651
Там, где изображены клапаны, вызываем этот диалог с нужными параметрами для каждого клапана:
Вложение 22650
Под значками клапанов удобно использовать невидимые кнопки чуть крупнее значков:
Вложение 22652
Yegor спасибо, а можно еще на функцию посмотреть.
Евгений Кислов, т.е просто так повернуть элемент нельзя с целью удобного расположения?
Сами попросили.
Код:FUNCTION SendPlcCmd : BOOL
VAR_INPUT
Cmd: SCommand;
Arg0, Arg1: WORD;
END_VAR
IF CMD_CTRL.cmdCount < 51 THEN
CMD_CTRL.cmdQueue[CMD_CTRL.cmdCount][0] := Cmd;
CMD_CTRL.cmdQueue[CMD_CTRL.cmdCount][1] := Arg0;
CMD_CTRL.cmdQueue[CMD_CTRL.cmdCount][2] := Arg1;
CMD_CTRL.cmdCount := CMD_CTRL.cmdCount + 1;
END_IF
Вложение 22666Код:PROGRAM CMD_CTRL (* Sends commands to the PLC *)
VAR_INPUT
Cmd, Arg0, Arg1: WORD;
cmdQueue: ARRAY[0..50] OF ARRAY [0..2] OF WORD;
cmdCount: INT;
END_VAR
VAR
Checksum: WORD;
Pulse: TON := (PT := T#300MS);
tx: BOOL;
cmdIdx: INT;
edge: R_TRIG;
END_VAR
(* Command conveyor, up to 50 commands in queue *)
tx := FALSE;
edge(CLK := cmdCount > 0);
Pulse(IN := NOT Pulse.Q AND cmdCount > 0);
IF (Pulse.Q OR edge.Q) AND cmdIdx < cmdCount THEN
Cmd := cmdQueue[cmdIdx][0];
Arg0 := cmdQueue[cmdIdx][1];
Arg1 := cmdQueue[cmdIdx][2];
Checksum := Cmd + Arg0 + Arg1;
tx := TRUE;
cmdIdx := cmdIdx + 1;
ELSIF Pulse.Q THEN
Cmd := 0;
cmdIdx := cmdCount := 0;
END_IF
Это уже на ПЛК110, к которому подключены две СПК:
Очень вероятно, что ничего этого в вашем случае не требуется, и можно обойтись телом первой функции, то есть сразу там исполнять команду.Код:PROGRAM CMD_CTRL
VAR_INPUT
awaitingStop1, awaitingStop2, timeEditable1, timeEditable2: BOOL;
timeLim1, timeLim2: TIME;
auto: BOOL;
END_VAR
VAR
cmdCount: INT;
pOut: POINTER TO BOOL;
dummy: BOOL;
cmdStat: ARRAY [Idle..LastCmd] OF INT;
b3online, b4online, b6online, b7online, b8online, uf1online: BOOL;
END_VAR
VAR_OUTPUT
resetNeeded: BOOL;
END_VAR
resetNeeded := FALSE;
IF SACmd <> Idle THEN
IF SACmd + SAArg0 + SAArg1 <> SACmdChecksum THEN
SACmd := Idle;
END_IF
cmdCount := cmdCount + 1;
END_IF
(* Select corresponding output *)
pOut := MUX(SAArg0,
ADR(k1), ADR(k2), ADR(k3), ADR(k4),
ADR(k5), ADR(k6), ADR(k7), ADR(k8),
ADR(k9), ADR(k10), ADR(k11), ADR(k12),
ADR(k13), ADR(kdv), ADR(npp1), ADR(npp2),
ADR(npp3), ADR(kez4), ADR(k14), ADR(k15),
ADR(k16), ADR(k17), ADR(k18), ADR(k19),
ADR(k20), ADR(k21), ADR(k22), ADR(k23),
ADR(k24), ADR(k25), ADR(k26), ADR(k27),
ADR(k28), ADR(npp4), ADR(ni1), ADR(ni2),
ADR(chiller2), ADR(usnd_start), ADR(kdv2),
ADR(chiller), ADR(k29), ADR(k30), ADR(k31)
);
(* Îòêëþ÷èòü ðó÷íîå óïðàâëåíèå â àâòîìàòè÷åñêîì ðåæèìå *)
IF auto THEN
pOut := ADR(dummy);
END_IF
IF NOT auto THEN
CASE SACmd OF
Open:
pOut^ := TRUE;
Close:
pOut^ := FALSE;
Toggle:
pOut^ := NOT pOut^;
SetATG:
IF SAArg1 = 0 THEN
PLC_PRG.ATG_SP := SAArg0;
ELSE
AUTO1.atgtemp := SAArg0;
END_IF
SetGPL:
IF SAArg1 = 0 THEN
INVControl.1 := SAArg0 > 0;
INVFreq := SAArg0 * 100;
ELSE
AUTO1.gplfreq := SAArg0;
END_IF
END_CASE
END_IF
CASE SACmd OF
SetTemp:
PLC_PRG.PID_SP := SAArg0;
SetTimers:
IF NOT SAArg0.0 THEN
AUTO1.time1 := WORD_TO_TIME(SAArg1 * 1000);
ELSE
AUTO2.time1 := WORD_TO_TIME(SAArg1 * 1000);
END_IF
StartAuto:
resetNeeded := NOT auto;
IF NOT SAArg1.0 AND AUTO1.step = 0 THEN
AUTO1.process := SAArg0;
ELSIF SAArg1.0 AND AUTO2.step = 0 THEN
AUTO2.process := SAArg0;
END_IF
StopAuto:
IF NOT SAArg1.0 THEN
AUTO1.stop := TRUE;
ELSE
AUTO2.stop := TRUE;
END_IF
AbortAuto:
IF NOT SAArg0.0 THEN
AUTO1.process := 0;
ELSE
AUTO2.process := 0;
END_IF
SetRegen:
PLC_PRG.RegenEnabled := SAArg0.0;
END_CASE
IF SACmd > 0 AND SACmd < SIZEOF(cmdStat) THEN
cmdStat[SACmd] := cmdStat[SACmd] + 1;
END_IF
SACmd := Idle;
Yegor, да зря попросил:).
С поворотом понятно.
Еще вопрос, у всех СПК1xx, c сенсором проблемы или только у меня? На 3 моделях уже при работе, то промахиваешься мимо кнопки, то жмется она со второго раза. Разница по сравнению с работой различных панелей оператора сразу заметна.
Добрый вечер. Я никак не могу подключить СПК107 и ПЛК110. Я посмотрел видео от Вас (два видео), на втором видео не показано как настраивается СПК107, но на видео видно что в дереве объектов есть модуль Модбас. Как его туда добавить и где его взять? И если можно, то как это все настроить что бы, я на СПК нажимал кнопку, а на контроллере включался выход и на панели загоралась лампа привязанная к этому выходу. Покажите где это искать хотя бы, но лучше если все объяснить, я быстро пойму. Спасибо.
З.Ы. У меня не переключается среда в режим Эксперт, все время возвращается на Стандарт, это как вылечить?
Среда переключается; я понимаю, что когда вы снова открываете это меню, там отображается Стандарт, но это обозначает не текущий режим настроек, а предлагаемый по умолчанию.
Правой кнопкой на Device - команда Добавить устройство.
Вложение 22693
В Modbus COM добавляете Modbus Master, в Modbus Master - Modbus Slave. Версии компонентов не должны превышать версию таргета СПК. Настройки компонентов в примере видны.
https://www.youtube.com/watch?v=VI8Ox28tFdg
Большое спасибо, надо было указать <All vendors> (этот пункт просто не виден надо покрутить список повыше) тогда все появляется. Настройки отображения данных делать так же как и на ПЛК, верно? Или тут какой то секрет есть?
Секрета, в принципе, нет.
1. В Modbus COM выставляете настройки порта (должны совпадать с настройками порта ПЛК). Обратите внимание, что номера портов в CODESYS смещены на +1 по сравнению с маркировкой на СПК - т.е. первому порту СПК соответствует номер 2, второму - номер 3 и т.д.
2. В Modbus Master достаточно поставить галочку Автореконнект.
3. В Modbus Slave указываете адрес ПЛК, добавляете каналы, привязываете к ним переменные, в параметре Всегда обновлять переменные ставите значение Включено 2. Стоит обратить внимание, что к каналам вы сможете привязать только переменные типов BOOL и WORD. Если необходимо передать переменную другого типа (например, REAL), то надо ее собирать в программе.
Евгений, спасибо за помощь, но все же я не пойму как это все собрать "до кучи".
Я на строил к-анал добавил переменную но все равно ничего не работает. В режиме ОНЛАЙН поле "текущее значение" типа BOOL выглядит сереньким.
Вот фото настройки ПЛК и переменной в КДС, красным я выделил то что считаю ошибочным, потому что номера не совпадают, подскажите как это исправить.
Вложение 22718
Вложение 22719
З.Ы. Мне надо отобразить что выход out_1 включен. Я так понимаю что цифры, обведенные красным должны совпадать.
Спасибо.
Хорош, но только вечером,спасибо вам за терпение.
Добрый вечер, вот файлы проекта. Посмотрите пожалуйста, буду вам признателен. Спасибо.
1. Проверьте, что у вас в Конфигураторе СПК выбран правильный режим порта (RS-485).
2. Для СПК в Modbus Slave в параметре Всегда обновлять переменные поставьте значение Включено 2.
Вложение 22747
3. В проекте СПК вы пытаетесь записать переменную типа BOOL с помощью функции Write Multiple Registers. Так делать не стоит. Объявите переменную типа WORD и работайте с выходами с помощью битовой маски:
Вложение 22748
Нет, не должны, не обращайте вообще внимания на эти цифры.Цитата:
Я так понимаю что цифры, обведенные красным должны совпадать.
Доброго дня! Проблема: Не удается воспользоваться retain в СПК207. Объявляю в PROGRAM PLC_PRG
VAR RETAIN
....
end_var
После отключения питания данные не сохраняются. Надеюсь, это не от того что я работаю в SP8? ))
UPD: Разобрался. Через
init_trig:r_trig
init_trig(CLK:=controller_on) \\controller_on в var объявлен как true
IF init_trig.Q then
...
END_IF
не хочет почему-то возвращать retain в визуализацию. Через
IF bInit=false THEN
....
...
bInit:=true
end_if
почему-то кладет на место исправно. Так и не понял почему.