Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя
Показано с 11 по 20 из 24

Тема: Перегрузка функций в CODESYS

  1. #11

  2. #12

    По умолчанию

    В целом разобрался, нужно потестировать но ПЛК пока далеко. Пытаюсь на эмуляторе прогнать, однако при вызове FB FILE.GetSize сразу вываливается ошибка ASM_CREATEJOB_FAILED 5113 Job creation of AsyncManager failed
    Эмулятор не поддерживает работу с файлами?

    Вы уж не сердитесь. Просто много вопросов возникает по ходу "пЪессы". Платформа пока новая, в процессе изучения

  3. #13
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    12,064

    По умолчанию

    Цитата Сообщение от RomeoVar Посмотреть сообщение
    В целом разобрался, нужно потестировать но ПЛК пока далеко. Пытаюсь на эмуляторе прогнать, однако при вызове FB FILE.GetSize сразу вываливается ошибка ASM_CREATEJOB_FAILED 5113 Job creation of AsyncManager failed
    Эмулятор не поддерживает работу с файлами?

    Вы уж не сердитесь. Просто много вопросов возникает по ходу "пЪессы". Платформа пока новая, в процессе изучения
    Эмулятор действительно не поддерживает работу с файлами.
    Используйте виртуальный контроллер:
    http://www.owen.ru/forum/showthread....l=1#post296706

  4. #14

    По умолчанию

    Цитата Сообщение от Евгений Кислов Посмотреть сообщение
    Не можете.
    Но можно сделать функцию с сигнатурой типа (pstStructData, szStructData, eStructData) - соответственно, (указатель на экземпляр нужной структуры, размер структуры в байтах, тип структуры).

    указатель на экземпляр нужной структуры - POINTER TO BYTE
    Под указатель можно подложить что угодно.
    А что мне даст входной параметр eStructData если у меня будет только один входной параметр pStructData? Тогда может имеет смысл сделать несколько входных параметров pstStructDataA, pstStructDataB, pstStructDataC и в зависимости от типа eStructData в FB обрабатывать соответствующую входную переменную? Но тогда нужно тщательно контролировать соответствие eStructData типу структуры входного параметра иначе меня будут ждать непредсказуемые "чудеса"

    И еще вопрос по ходу: Тут по поводу указателей на экземпляры у меня вопрос - ведь процессор на самом деле 32 разрядный, а это значит что выборка по шине данных происходит, грубо говоря по 4 байта за один цикл чтения по шине данных. Соответственно если структура данных занимает неполных 32 бита, должно происходить выравнивание. Не произойдет ли "искажение" сохраняемых/получаемых данных если использовать POINTER TO BYTE а сами данные будут INT или того хуже FLOAT, или вообще какие-нибудь сложные структуры?
    Последний раз редактировалось RomeoVar; 13.07.2021 в 22:35.

  5. #15
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    12,064

    По умолчанию

    А что мне даст входной параметр eStructData если у меня будет только один входной параметр pStructData?
    С помощью "одного входного параметра pStructData" можно передать в блок любые данные любых типов.

    Но тогда нужно тщательно контролировать соответствие eStructData типу структуры входного параметра иначе меня будут ждать непредсказуемые "чудеса"]]
    Это справедливое высказывание. Программирование - оно вообще во многом именно про "тщательно контролировать".

    И еще вопрос по ходу: Тут по поводу указателей на экземпляры у меня вопрос - ведь процессор на самом деле 32 разрядный, а это значит что выборка по шине данных происходит, грубо говоря по 4 байта за один цикл чтения по шине данных. Соответственно если структура данных занимает неполных 32 бита, должно происходить выравнивание. Не произойдет ли "искажение" сохраняемых/получаемых данных если использовать POINTER TO BYTE а сами данные будут INT или того хуже FLOAT, или вообще какие-нибудь сложные структуры?
    Выравнивание памяти в структурах есть.
    Пользователь должен учитывать его при обработке структур.
    См. также:
    https://help.codesys.com/webapp/_cds...rsion=3.5.17.0

  6. #16

    По умолчанию

    С помощью "одного входного параметра pStructData" можно передать в блок любые данные любых типов.
    Спрошу иначе. Какой тип pStructData будет объявлен в FB?

    Я сделал так:
    Код:
    FUNCTION_BLOCK SaveDataToFile
    VAR_INPUT
    	sFileName		: STRING;
    	pstDataMC		: POINTER TO MACHINE_CONFIG;
    	pstDataRCP		: POINTER TO RECIPIES;
    	pstDataDP		: POINTER TO DRIVE_PARAMS;
    	szData			: UINT;
    	eNameData		: STRUCT_NAME; 
    END_VAR
    А в коде FB я обрабатываю так (кусок логики):
    Код:
    FILE_WORK.WRITE:
    		CASE eNameData OF
    			STRUCT_NAME.MACHINE_CONFIG:
    				fbFileWrite(xExecute:=TRUE, hFile:=hFile, pBuffer:=pstDataMC, szSize:=szData);
    			STRUCT_NAME.DRIVE_PARAMS:
    				fbFileWrite(xExecute:=TRUE, hFile:=hFile, pBuffer:=pstDataDP, szSize:=szData);
    			STRUCT_NAME.RECIPIES:
    				fbFileWrite(xExecute:=TRUE, hFile:=hFile, pBuffer:=pstDataRCP, szSize:=szData);	
    		END_CASE
    		IF fbFileWrite.xDone THEN
    			fbFileWrite(xExecute:=FALSE);
    			CASE eNameData OF
    				STRUCT_NAME.MACHINE_CONFIG:
    					wCRC16_std := MEM.CRC16_standard(pMemoryBlock := pstDataMC, uiLength := szData);
    				STRUCT_NAME.DRIVE_PARAMS:
    					wCRC16_std := MEM.CRC16_standard(pMemoryBlock := pstDataDP, uiLength := szData);
    				STRUCT_NAME.RECIPIES:
    					wCRC16_std := MEM.CRC16_standard(pMemoryBlock := pstDataRCP, uiLength := szData);	
    			END_CASE
    			enState := FILE_WORK.WRITE_CRC;
    		END_IF
    		IF fbFileWrite.xError THEN
    			CASE enFileErr OF
    				; //Обработчик ошибок
    			END_CASE
    		END_IF
    МОжет можно проще, но я не понял как

  7. #17
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    12,064

    По умолчанию

    Спрошу иначе. Какой тип pStructData будет объявлен в FB?
    POINTER TO BYTE, например.
    Если для блока содержание структуры не имеет значения (например, нет необходимости ее парсить) - то eNameData вообще не нужен.

  8. #18

    По умолчанию

    Цитата Сообщение от Евгений Кислов Посмотреть сообщение
    POINTER TO BYTE, например.
    А PVOID не лучше? Я просто с ним никак не разберусь. В Си есть тип переменной VOID, который как раз и используется в случаях когда заранее не известен принимаемый тип. Если это так, то PVOID будет лучше чем POINTER TO BYTE

  9. #19
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    12,064

    По умолчанию

    Цитата Сообщение от RomeoVar Посмотреть сообщение
    А PVOID не лучше? Я просто с ним никак не разберусь. В Си есть тип переменной VOID, который как раз и используется в случаях когда заранее не известен принимаемый тип. Если это так, то PVOID будет лучше чем POINTER TO BYTE
    В CODESYS указатели фактически хранятся как переменные типа DWORD (для 32-битных платформ) или LWORD (для 64-битных платформ).
    POINTER TO <TYPE> - это синтаксический сахар над этим DWORD/LWORD, который позволяет компилятору проверять соответствие типов при разыменовании и обеспечивать индексный доступ.
    CAA.PVOID - это просто псевдоним (ALIAS) для типа __XWORD. Это платформо-зависимый тип, который на 32-битных платформах превращается в DWORD, а на 64-битных - в LWORD.

    Поэтому принципиальной разницы между описанными вами вариантами для описанной вами ситуации я вообще не вижу.

  10. #20

    По умолчанию

    ТАк правильно объявлять переменную с таким типом правильно как ?

    POINTER TO CAA.PVOID

    или просто
    CAA.PVOID т.к. это уже указатель?

Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя

Похожие темы

  1. Ответов: 38
    Последнее сообщение: 23.06.2017, 07:42
  2. Коды функций Modbus-RTU
    от Newcomer в разделе ПЛК1хх
    Ответов: 15
    Последнее сообщение: 10.11.2015, 10:02
  3. Ответов: 4
    Последнее сообщение: 14.07.2015, 22:17
  4. Переменные в отладке функций.
    от Edik_Ponomarenko в разделе ПЛК1хх
    Ответов: 10
    Последнее сообщение: 30.12.2011, 11:01
  5. Ответов: 3
    Последнее сообщение: 26.01.2010, 21:01

Ваши права

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