не чего я вашем CS не понимаю...пока готовил другое рабочее место с возможностью подключения к интернету...скачал ту же версию CS...все заработало..извиняюсь за беспокойство..
Вид для печати
Добрый день, есть СПК107 m01, можно ли обновить проект с флэшки, прямо из запушенного проекта, типа подключил флешку и нажал кнопку обновить, миную стандартный способ
Это можно сделать с помощью библиотеки CmpSysExec, которая позволяет выполнять команды Linux.
https://ftp.owen.ru/CoDeSys3/11_Docu...sExec_v2.0.pdf
Алгоритм следующий:
1. Выполняем команду service retain clear
2. Выполняем копирование файлов проекта из директории на накопителе (/mnt/ufs/media/sda1/app.spk1xxm01) в рабочую директорию CODESYS (/home/root/CODESYS_WRK/PlcLogic).
Тут есть нюанс - содержимое папок /visu и (если есть) /alarms, /trend копируется из папки app.spk1xxm01 в одноименные папки в PlcLogic.
А вот файлы приложения (Application.app, Application.crc) хранятся в корне app.spk1xxm01 - но в PlcLogic сначала надо создать директорию Application, а потом в нее скопировать эти файлы.
См. в сети информацию о командах cp (копирование) и mkdir (создание директории).
3. Выполнить команду service codesys restart
Доброе время суток!
Как реализовать внутри ПЛК200 базу данных? писать нужно массив структур.
Код:TYPE StTestGS:
STRUCT
TestNomer:INT; //Номер тестирования
TestDT:STRING(60); //Дата и время тестирования
ZavodNomer:WSTRING(60); //Заводской номер
ZavodIzgotovitel:WSTRING(60); //Завод изготовитель
TipIspolneniy:WSTRING(60); //Тип исполнения
Model:WSTRING(60); //Модель
NovRem:BOOL; //0-новый 1-ремонтный
Vladelec:WSTRING(60); //Владелец
DiametrVala:INT; //Диаметр вала
Shlicevay:WSTRING(60); //Исполнение шлицевой части
MuftaVerh:WSTRING(60); //Верхняя муфта
MuftaNiz:WSTRING(60); //Нижняя муфта
DiapazonPodach:STRING(60); //Диапазон подачи
DlinnaUzla:INT; //Длинна узла
Resultat:BOOL; //Результат тестирования (1-годен 0-негоден)
Temperatura:ARRAY [0..31] OF BYTE; //Показания температуры
Vibraciy1:ARRAY [0..31] OF BYTE; //Вибрация датчик 1
Vibraciy2:ARRAY [0..31] OF BYTE; //Вибрация датчик 2
Vibraciy3:ARRAY [0..31] OF BYTE; //Вибрация датчик 3
Vibraciy4:ARRAY [0..31] OF BYTE; //Вибрация датчик 4
END_STRUCT
END_TYPE
Добрый день.
С прошлой недели ничего не изменилось: https://owen.ru/forum/showthread.php...l=1#post361853
С записью в фаил есть ограничение в 255 символов в строку, те в одну строку не уместить, если брать несколько строк конечно... но ребята говорят что можно реализовать MSQL на ПЛК при помощи библиотек. вот вопрос как это сделать ?
Либо помогите пожалуйста реализовать через запись в фаил, глубина массива структуры не менее 1000 записей. причем нужно как дополнять после каждого тестирования, так и читать любую запись по необходимости
Добрый день.. Снова дурацкие вопросы.. Пытаюсь понять как работают Объединения.. Вложение 56543Вложение 56544
почему при установке в 1 байт 0 и 1 массива Works_Fan_BOOL: ARRAY[0..15] OF BOOL ,переменная Works_Fan_WORD принимает значение 257?
а при установке в 1 байт страрше 8 значение переменной не меняться вообще?))
Будет ли обновление библиотек для CODESYS 3.5.17? Там появилась долгожданная поддержка Git, но, например библиотека OwenStorage выдает ошибки наподобие "[ERROR] owenstorage, 3.5.11.32 (production association owen): ConvertSymConPrg [OwenSymbol]: C0032: Cannot convert type 'LWORD' to type 'DWORD'"
Добрый день.
Потому что BOOL физически занимает 8 бит.
https://help.codesys.com/webapp/_cds...rsion=3.5.17.0
Отличное видео от Сергея Романова прямо по теме вашего вопроса:
https://youtu.be/WTkJPIpjkOo
Когда-нибудь - будет. В данный момент мы переходим на 3.5.16.30.
3.5.17 еще сырой, а насчет CODESYS Git (который тоже сырой) - у вас есть подписка на CODESYS Professional Developer Edition?
а как тогда WORD разбить на 16 отдельных BOOL ?
Ребят в примере с работой с файлами используется функция CONCAT, если я использую StringUtils то аналог функции будет какой?
Как сделать чтобы это:
Код:// функция склеивает заданное число строковых переменных, помещенных в массив
FUNCTION CONCAT11 : STRING(255)
VAR_INPUT
asSTR: ARRAY [0..c_MAX_STR] OF STRING;
END_VAR
VAR
sBuffer: STRING; // промежуточная переменная
i: INT; // счетчик для цикла
END_VAR
VAR CONSTANT
c_MAX_STR: INT:=10; // размер массива строковых переменных
END_VAR
работало с WSTRING через библиотеку StringUtils без ограничения длинна строкиКод:FOR i:=0 TO c_MAX_STR DO
sBuffer:=CONCAT(sBuffer, asSTR[i]);
END_FOR
CONCAT11:=sBuffer;
библиотека стандарт используем CONCAT это для STRING, библиотека стандарт64 используем WCONCAT это для WSTRING с ограничением до 255символов
как использовать тогда библиотеку StringUtils и функцию StrConcatW для строки длиньше чем 255 символов?
в стандарт библиотеке там 2стороки и выход 1 строка, StrConcatW в библиотеке StringUtils вообще не понял.
Попроще:
Код:PROGRAM PLC_PRG
VAR
sLongStr1: STRING(4096) := 'длинная строка 1';
sLongStr2: STRING(4096) := 'длинная строка 2';
sVeryLongStr: STRING(8192);
xConcat: BOOL;
END_VAR
IF xConcat THEN
// склеить sLongStr1 и sLongStr2 в sVeryLongStr
STU.StrConcatA(ADR(sLongStr1), ADR(sVeryLongStr), SIZEOF(sVeryLongStr) );
STU.StrConcatA(ADR(sLongStr2), ADR(sVeryLongStr), SIZEOF(sVeryLongStr) );
xConcat := FALSE;
END_IF
Всем привет!
В общем вот код:
Запись и прочие все работает отлично!! не могу прочитать фаил, где у меня ошибка?Код:CASE eState OF
0: // шаг открытия файла
IF xWFile AND xOpenF //Запись файла
THEN
fbFileOpen(xExecute:=TRUE, sFileName:=sVisuFileName, eFileMode:=FILE.MODE.MAPPD);
// если файл, в который производится запись, не существует, то создадим его и запишем в него заголовок архива
IF fbFileOpen.eError=FILE.ERROR.NOT_EXIST
THEN
fbFileOpen(xExecute:=FALSE);
eState:=1; // шаг создания файла
xTitle := TRUE;
END_IF
// если файл существует и был успешно открыт, то переходим к шагу записи файла
IF fbFileOpen.xDone AND xWFile
THEN
hFile:=fbFileOpen.hFile;
fbFileOpen(xExecute:=FALSE);
eState:=2; // шаг записи в буфер
END_IF
ELSE IF xRFile AND xOpenF //Чтение файла
THEN
fbFileOpen(xExecute:=TRUE, sFileName:=sVisuFileName, eFileMode:=FILE.MODE.MREAD);
// если файл существует и был успешно открыт, то переходим к шагу чтения файла
IF fbFileOpen.xDone AND xRFile
THEN
hFile:=fbFileOpen.hFile;
fbFileOpen(xExecute:=FALSE);
eState:=6; // шаг установки позиции для чтения из файла
END_IF
END_IF
END_IF
1: // шаг создания файла
// в созданном файле еще нет записей
uiArchEntry:=0;
fbFileOpen(xExecute:=TRUE, sFileName:=sVisuFileName, eFileMode:=FILE.MODE.MWRITE);
IF fbFileOpen.xDone THEN
hFile := fbFileOpen.hFile;
fbFileOpen(xExecute:=FALSE);
// после создания файла можно перейти к шагу записи данных
eState:=2;
END_IF
IF fbFileOpen.xError THEN
// обработка ошибок
END_IF
2: // шаг записи в буфер
// если это первая запись в файле - то перед ней запишем заголовок
IF uiArchEntry=0
THEN
// запись строки архива в буфер
fbFileWrite(xExecute:=TRUE, hFile:=hFile, pBuffer:=ADR(c_sTitle), szSize:=1978);
ELSE
//Записываемая строка
sArchEntry := WstWstVLWst.sVeryLongWStr;
// запись строки архива в буфер
fbFileWrite(xExecute:=TRUE, hFile:=hFile, pBuffer:=ADR(sArchEntry), szSize:=1978); //1978 Байт строка
END_IF
IF fbFileWrite.xDone THEN
fbFileWrite(xExecute:=FALSE);
// после записи число строк в архиве увеличилось на одну
uiArchEntry:=uiArchEntry+1;
// теперь можно перейти к шагу сброса буфера в файл
eState:=3; // шаг сброса буфера в файл
END_IF
IF fbFileWrite.xError THEN
// обработка ошибок
END_IF
3: // шаг сброса буфера в файл
fbFileFlush(xExecute:=TRUE, hFile:=hFile);
IF fbFileFlush.xDone THEN
fbFileFlush(xExecute:=FALSE);
// теперь можно перейти к шагу закрытия файла
eState:=4; // шаг закрытия файла
END_IF
IF fbFileFlush.xError THEN
// обработка ошибок
END_IF
4: // шаг закрытия файла
fbFileClose(xExecute:=TRUE, hFile:=hFile);
IF fbFileClose.xDone THEN
fbFileClose(xExecute:=FALSE);
xOpenF := FALSE;
// теперь можно перейти к шагу определения размера файла
eState:=5; // шаг определения размера файла
END_IF
5: // шаг определения размера файла
fbFileGetSize(xExecute:=TRUE, sFileName:=sVisuFileName);
// определяем размер файла
IF fbFileGetSize.xDone THEN
udiArchSize:=fbFileGetSize.szSize;
fbFileGetSize(xExecute:=FALSE);
// вернемся на шаг открытия файла для ожидания следующего управляющего сигнала
eState:=0; // шаг открытия файла
END_IF
// размер несуществующего файла...
IF fbFileGetSize.eError=FILE.ERROR.NOT_EXIST THEN
// очевидно, можно интерпретировать как ноль
udiArchSize:=0;
fbFileGetSize(xExecute:=FALSE);
// вернемся на шаг открытия файла для ожидания следующего управляющего сигнала
eState:=0;
ELSIF fbFileGetSize.xError THEN
fbFileGetSize(xExecute:=FALSE);
eState:=0; // шаг открытия файла
END_IF
6: // шаг установки позиции для чтения из файла
fbFileSetPos(xExecute:=TRUE, hFile:=hFile, udiPos:=SIZEOF((1976)*2)); //Выбор строки для чтения количество байт на 1 строку умножить на номер строки
IF fbFileSetPos.xDone THEN
fbFileSetPos(xExecute:=FALSE);
// позиция для чтения выбрана, теперь можно перейти к шагу чтения данных
eState :=7;
END_IF
IF fbFileSetPos.xError THEN
// обработка ошибок
END_IF
7: // шаг чтения файла
fbFileRead(xExecute:=TRUE, hFile:=hFile, pBuffer:=ADR(stReadData), szBuffer:=SIZEOF(1976)); //Переменная для выгрузки и количество байт
IF fbFileRead.xDone THEN
fbFileRead(xExecute:=FALSE);
// теперь можно перейти к шагу закрытия файла
eState :=4;
END_IF
IF fbFileRead.xError THEN
// обработка ошибок
END_IF
END_CASE
Цитата:
не могу прочитать фаил, где у меня ошибка?
Код:szBuffer:=SIZEOF((1976)*2)
Оператор SIZEOF возвращает размер своего аргумента в байтах.
Размер литерала "1976*2" - это, вероятно, 2 байта (на некоторых платформах может быть 4).
Вероятно, вы хотели в данном фрагменте кода выразить какую-то другую мысль.
Добрый день.
codesys 3.5 modbus rtu.
Настраивал опрос по команде, в том числе явно добавил iodrvmodbus 3.5.12.0.
iodrvmodbus 3.5.5.0. вызывал конфликт, и был удален, но после автоматически был неявно добавлен плагином.
Конфликт устранил выбором версии iodrvmodbus в меню свойств.
Подскажите, пожалуйста, где почитать о неявной установке библиотек плагином?
Да, конечно.
Сейчас с проектом проблем нет.
Я не смог разобраться что за плагин автоматически добавляет iodrvmodbus 3.5.5.0., как автоматически добавляются библиотеки вообще и какими настройками это вызвано.
Где об этом можно почитать?
Спасибо. Это я запутался в версиях Modbus_Master_COM_Port и полез "в дебри".
Всем привет, вылезла проблемка одна
неработает код.
причину в принципе понимаю, то что в правой стороне цыфры у меня с пробелами, как убрать пробелы или как сделать чтобы работало? те строка 3 символа, "11П" 11цифра и П пробел или "1ПП"Код:I10:=0;
FOR I10 := 0 TO 30 BY 1 DO
Trend1[I10]:=WSTRING_TO_BYTE(StructuraTestGS[1].Temperatura[I10]);
Trend2[I10]:=WSTRING_TO_BYTE(StructuraTestGS[1].Vibraciy1[I10]);
Trend3[I10]:=WSTRING_TO_BYTE(StructuraTestGS[1].Vibraciy2[I10]);
Trend4[I10]:=WSTRING_TO_BYTE(StructuraTestGS[1].Vibraciy3[I10]);
Trend5[I10]:=WSTRING_TO_BYTE(StructuraTestGS[1].Vibraciy4[I10]);
END_FOR