СODESYS V3.5: Repository Archive V3.5 SP4 (необходим для старых СПК) / Раздел CDS V3.5 на сайте
Форум: Вопросы и ответы / Визуализация / Настройка обмена с другими устройствами
Web-панель ВП110 / Modbus-индикатор СМИ2-М
Telegram: @JuneSmellsLikeBlood | e-mail: e.kislov@owen.ru | oscat.ru | Как обратиться в техподдержку?
Как отлаживать ошибки | Отладка проектов в CODESYS V3.5 | XY problem | Как правильно задавать вопросы | AnyDesk
В целом разобрался, нужно потестировать но ПЛК пока далеко. Пытаюсь на эмуляторе прогнать, однако при вызове FB FILE.GetSize сразу вываливается ошибка ASM_CREATEJOB_FAILED 5113 Job creation of AsyncManager failed
Эмулятор не поддерживает работу с файлами?
Вы уж не сердитесь. Просто много вопросов возникает по ходу "пЪессы". Платформа пока новая, в процессе изучения
Эмулятор действительно не поддерживает работу с файлами.
Используйте виртуальный контроллер:
http://www.owen.ru/forum/showthread....l=1#post296706
СODESYS V3.5: Repository Archive V3.5 SP4 (необходим для старых СПК) / Раздел CDS V3.5 на сайте
Форум: Вопросы и ответы / Визуализация / Настройка обмена с другими устройствами
Web-панель ВП110 / Modbus-индикатор СМИ2-М
Telegram: @JuneSmellsLikeBlood | e-mail: e.kislov@owen.ru | oscat.ru | Как обратиться в техподдержку?
Как отлаживать ошибки | Отладка проектов в CODESYS V3.5 | XY problem | Как правильно задавать вопросы | AnyDesk
А что мне даст входной параметр eStructData если у меня будет только один входной параметр pStructData? Тогда может имеет смысл сделать несколько входных параметров pstStructDataA, pstStructDataB, pstStructDataC и в зависимости от типа eStructData в FB обрабатывать соответствующую входную переменную? Но тогда нужно тщательно контролировать соответствие eStructData типу структуры входного параметра иначе меня будут ждать непредсказуемые "чудеса"
И еще вопрос по ходу: Тут по поводу указателей на экземпляры у меня вопрос - ведь процессор на самом деле 32 разрядный, а это значит что выборка по шине данных происходит, грубо говоря по 4 байта за один цикл чтения по шине данных. Соответственно если структура данных занимает неполных 32 бита, должно происходить выравнивание. Не произойдет ли "искажение" сохраняемых/получаемых данных если использовать POINTER TO BYTE а сами данные будут INT или того хуже FLOAT, или вообще какие-нибудь сложные структуры?
Последний раз редактировалось RomeoVar; 13.07.2021 в 22:35.
С помощью "одного входного параметра pStructData" можно передать в блок любые данные любых типов.А что мне даст входной параметр eStructData если у меня будет только один входной параметр pStructData?
Это справедливое высказывание. Программирование - оно вообще во многом именно про "тщательно контролировать".Но тогда нужно тщательно контролировать соответствие eStructData типу структуры входного параметра иначе меня будут ждать непредсказуемые "чудеса"]]
Выравнивание памяти в структурах есть.И еще вопрос по ходу: Тут по поводу указателей на экземпляры у меня вопрос - ведь процессор на самом деле 32 разрядный, а это значит что выборка по шине данных происходит, грубо говоря по 4 байта за один цикл чтения по шине данных. Соответственно если структура данных занимает неполных 32 бита, должно происходить выравнивание. Не произойдет ли "искажение" сохраняемых/получаемых данных если использовать POINTER TO BYTE а сами данные будут INT или того хуже FLOAT, или вообще какие-нибудь сложные структуры?
Пользователь должен учитывать его при обработке структур.
См. также:
https://help.codesys.com/webapp/_cds...rsion=3.5.17.0
Последний раз редактировалось Евгений Кислов; 14.07.2021 в 04:46.
СODESYS V3.5: Repository Archive V3.5 SP4 (необходим для старых СПК) / Раздел CDS V3.5 на сайте
Форум: Вопросы и ответы / Визуализация / Настройка обмена с другими устройствами
Web-панель ВП110 / Modbus-индикатор СМИ2-М
Telegram: @JuneSmellsLikeBlood | e-mail: e.kislov@owen.ru | oscat.ru | Как обратиться в техподдержку?
Как отлаживать ошибки | Отладка проектов в CODESYS V3.5 | XY problem | Как правильно задавать вопросы | AnyDesk
Спрошу иначе. Какой тип pStructData будет объявлен в FB?С помощью "одного входного параметра 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
МОжет можно проще, но я не понял какКод: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
POINTER TO BYTE, например.Спрошу иначе. Какой тип pStructData будет объявлен в FB?
Если для блока содержание структуры не имеет значения (например, нет необходимости ее парсить) - то eNameData вообще не нужен.
Последний раз редактировалось Евгений Кислов; 14.07.2021 в 08:26.
СODESYS V3.5: Repository Archive V3.5 SP4 (необходим для старых СПК) / Раздел CDS V3.5 на сайте
Форум: Вопросы и ответы / Визуализация / Настройка обмена с другими устройствами
Web-панель ВП110 / Modbus-индикатор СМИ2-М
Telegram: @JuneSmellsLikeBlood | e-mail: e.kislov@owen.ru | oscat.ru | Как обратиться в техподдержку?
Как отлаживать ошибки | Отладка проектов в CODESYS V3.5 | XY problem | Как правильно задавать вопросы | AnyDesk
В CODESYS указатели фактически хранятся как переменные типа DWORD (для 32-битных платформ) или LWORD (для 64-битных платформ).
POINTER TO <TYPE> - это синтаксический сахар над этим DWORD/LWORD, который позволяет компилятору проверять соответствие типов при разыменовании и обеспечивать индексный доступ.
CAA.PVOID - это просто псевдоним (ALIAS) для типа __XWORD. Это платформо-зависимый тип, который на 32-битных платформах превращается в DWORD, а на 64-битных - в LWORD.
Поэтому принципиальной разницы между описанными вами вариантами для описанной вами ситуации я вообще не вижу.
СODESYS V3.5: Repository Archive V3.5 SP4 (необходим для старых СПК) / Раздел CDS V3.5 на сайте
Форум: Вопросы и ответы / Визуализация / Настройка обмена с другими устройствами
Web-панель ВП110 / Modbus-индикатор СМИ2-М
Telegram: @JuneSmellsLikeBlood | e-mail: e.kislov@owen.ru | oscat.ru | Как обратиться в техподдержку?
Как отлаживать ошибки | Отладка проектов в CODESYS V3.5 | XY problem | Как правильно задавать вопросы | AnyDesk
ТАк правильно объявлять переменную с таким типом правильно как ?
POINTER TO CAA.PVOID
или просто
CAA.PVOID т.к. это уже указатель?