CODESYS форум

Добро пожаловать на официальный форум CODESYS, 3S-Smart Software Solutions GmbH | A member of the CODESYS Group
Deutsche Version English version russian version 
Текущее время: Сб авг 24, 2019 11:00 am

Часовой пояс: UTC+01:00




Начать новую тему  Ответить на тему  [ 10 сообщений ] 
Автор Сообщение
 Заголовок сообщения: Строки в Codesys
СообщениеДобавлено: Пн мар 17, 2008 7:13 am 
Не в сети

Зарегистрирован: Ср июн 20, 2007 12:10 pm
Сообщения: 31
Озадачился вопросом ограничений работы со строками в Codesys:
1) Хотя размер строк не ограничен, но функции Standard.lib (CONCAT, etc.) работают со строками до 255 символов;
2) Требование сосредоточить всю работу состроками в одной задаче.
В итоге написал свой функциональный блок для конкатенации строк размером больше 255 символов. Может кому-нибудь пригодится...
Тип данных - строка 600 символов
Код:
TYPE widestring :STRING(600);
END_TYPE

собственно функциональный блок:
Код:
FUNCTION_BLOCK Concat_string
VAR_INPUT
   string1,string2:widestring;
END_VAR
VAR_OUTPUT
   overflow:BOOL;
   out:widestring;
END_VAR
VAR
   pt,pt2:POINTER TO BYTE;
   tmp:widestring;
END_VAR

(* @END_DECLARATION := '0' *)

tmp:='';
out:='';
overflow:=FALSE;

(*check overflow result string*)
IF (LEN(string1)+LEN(string2)>(SIZEOF(string1)-1)) THEN
   overflow:=TRUE;
   RETURN;
END_IF

pt:=ADR(string1);
pt2:=ADR(tmp);

IF string1<>'' THEN
   (*copy 1st string*)
   WHILE pt^<>0 DO (*assuming null-terminated string*)
      pt2^:=pt^;
      pt:=pt+1;
      pt2:=pt2+1;
   END_WHILE

   pt:=ADR(string2);
   (*copy 1st string*)
   WHILE pt^<>0 DO
      pt2^:=pt^;
      pt:=pt+1;
      pt2:=pt2+1;
   END_WHILE
   pt2^:=0; (*end 0*)

ELSE
   tmp:=string2;
END_IF

out:=tmp;

END_FUNCTION_BLOCK


PS. Вопрос к разработчикам: ограничение по использованию строковых функций в различных задачах является обязательным? Т.к. использую функции в нескольких задачах, пересечений данных и др. ошибок пока не видел...


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: Пн мар 17, 2008 10:05 am 
Не в сети
Site Admin

Зарегистрирован: Ср июл 20, 2005 2:32 pm
Сообщения: 153
CoDeSys V2.3 сейчас поддерживает более 20 аппаратных платформ и в них есть определенные отличия:
* В некоторых из них при адресации строк используются 8 бит индексы = макс. строка 255 символов.
* Все стандартные строковые библиотеки используют один стек промежуточных результатов для выражений со строками. Если платформа поддерживает вытесняющую многозадачность, то проблемы возникнут. Возможно, это вылезет раз в году при случайном совпадении времени вычисления этих выражений в разных задачах, однако рано или поздно, в самый неподходящий момент вылезет. Короче, лучше не закладывать в программу такую 'мину замедленного действия'.


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: Пн мар 17, 2008 11:12 am 
Не в сети

Зарегистрирован: Ср июн 20, 2007 12:10 pm
Сообщения: 31
Т.е. даже использование функции LEN в моем функциональном блоке потенциально опасно?
И еще. Использование экземпляров функционального блока (с собственной памятью под переменные) в различных задачах гарантирует независимость данных и устранение потенциальной ошибки? Правильно я понимаю суть FB?


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: Пн мар 17, 2008 11:54 am 
Не в сети
Site Admin

Зарегистрирован: Ср июл 20, 2005 2:32 pm
Сообщения: 153
В Вашем примере есть переменная tmp. Вот подобные штуки есть и в функциях би-ки строк, причем память под них используется общая быстрая, без косвенной адресации...

:) С FB все верно, если в нем не задействовано неких разделяемых ресурсов. Если ж два экземпляра FB в разных задачах начнут менять одну глобальную переменную, тут увы… :roll:

:idea: Кстати, скачайте биб-ку OSCAT. Это внутренняя биб-ка CoDeSys. Т.е. ее можно открыть и посмотреть что и как в ней сделано. Кроме того сам набор POU в ней неплохой.


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: Пн мар 17, 2008 1:21 pm 
Не в сети

Зарегистрирован: Ср июн 20, 2007 12:10 pm
Сообщения: 31
OFFTOP: библиотеку OSCAT знаю и активно использую ибо хорошая вещь 8)

По делу: на операции сравнения <> и присвоения := для строк также накладывается ограничение однозадачности? Т.е. в моем случае надо полностью переходить на работу с указателями или можно использовать встроенные функции/операции?
Насчет "общей быстрой памяти" немного не понял... Codesys для своих внутренних целей использует какую-то особую память или как? Можно пояснить, please.

PS. При работе с указателями в Codesys есть ли какие-либо ограничения? Кроме прямых рук естественно... :D


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: Пн мар 17, 2008 2:41 pm 
Не в сети
Site Admin

Зарегистрирован: Ср июл 20, 2005 2:32 pm
Сообщения: 153
Avgur писал(а):
На операции сравнения <> и присвоения := для строк также накладывается ограничение однозадачности?

Нет
Avgur писал(а):
Насчет "общей быстрой памяти" немного не понял...

В 16 или 8 бит процессоре вычисление длинного адреса переменной это целая военная операция. Это гораздо медленнее, чем непосредственное использование адреса-константы прямо в ассемблерной инструкции. В некоторых микроконтроллерах (на которых делают ПЛК) есть быстрая внутренняя память (обычно очень мало) в чипе и внешняя, подключенная через (часто мультиплексированную) шину адрес/данные. Так вот при сборке системы исполнения CoDeSys SP в быструю память я могу поместить стек, часто используемые системные переменные, область входов/выходов ПЛК, блок памяти для строк и др. Исторически так получилось что реализовали строковые функции жестко выделив под их промежуточные переменные блок памяти по фиксированному адресу. Это дает хороший выигрыш по скорости в системах со слабым процессором.
Avgur писал(а):
При работе с указателями в Codesys есть ли какие-либо ограничения?

Только руки :wink:


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: Ср апр 16, 2008 1:17 pm 
Не в сети

Зарегистрирован: Ср июн 20, 2007 12:10 pm
Сообщения: 31
Еще вопросы!
Igor Petrov писал(а):
С FB все верно, если в нем не задействовано неких разделяемых ресурсов. Если ж два экземпляра FB в разных задачах начнут менять одну глобальную переменную, тут увы… :roll:

Другой ракурс:
По аналогии с функциональным блоком FIFO из OSCAT.lib сделал свой FB только для записи/чтения строк. Экземпляр FB объявлен глобально. Операция записи используется в одной задаче, операция чтения - в другой. Здесь могут быть проблемы?


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: Чт апр 17, 2008 9:07 am 
Не в сети
Site Admin

Зарегистрирован: Ср июл 20, 2005 2:32 pm
Сообщения: 153
Avgur писал(а):
...Экземпляр FB объявлен глобально. Операция записи используется в одной задаче, операция чтения - в другой. Здесь могут быть проблемы?

Если в используемом ПЛК не реализована вытесняющая многозадачность и если операция чтения/записи выполняется за один вызов экземпляра, то нет.

Иначе возможно что в момент когда задача 1 часть строки считала, задача 2 возьмет и строку эту перепишет и задача 1 получит ерунду. ..Чтобы гарантированно избежать такой ситуации нужно использовать семафор. См. SysLibSem_RU.pdf

_________________
_IP_


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: Чт апр 17, 2008 12:50 pm 
Не в сети

Зарегистрирован: Ср июн 20, 2007 12:10 pm
Сообщения: 31
Хмм... :? Операции чтения записи выполняются за 1 вызов экземпляра FB. Задача, в которой записываются данные, имеет тип freewheling и более высоким приоритетом. Задача по чтению - тип cyclic, интервал=1 сек и меньший приоритет.
Платформа - Linux, вытесняющая многозадачность реализована (я думаю :) ) Все равно можно ожидать появления ошибки? Или для 100% гарантии использовать семафоры?


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: Пн фев 15, 2010 8:18 am 
Не в сети

Зарегистрирован: Ср июн 20, 2007 12:10 pm
Сообщения: 31
Подниму тему.
Игорь, поясните, пожалуйста, один момент: если вместо фнукционального блока Concat_string написать функцию с тем же кодом и использовать ее в параллельных задачах будут проблемы пересечения данных?
Т.е. есть 2 программы, в обеих вызывается функция сложения строк, то при каждом вызове память под временную переменную tmp будет выделяться снова, а не так
Цитата:
Исторически так получилось что реализовали строковые функции жестко выделив под их промежуточные переменные блок памяти по фиксированному адресу


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 10 сообщений ] 

Часовой пояс: UTC+01:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB