PDA

Просмотр полной версии : INVALID: 16#.....



Kostennikov
26.04.2017, 15:06
пробую передать в ФБ два массива
количество выполненной работы DWORD и статус в работе или нет BOOL.
во время работы в режиме эмуляции выскакивает в переменной типа BOOl invalid: 16# далее значение меняется от того что передано в массив DWORD но если массив DWORD равен 0 ошибки нет. может быть это связано с использованием цикла?

Скрины прилагаю308033080430805
ни когда с таким не сталкивался чтение документации не помогло. или она до меня не доходит. гуглить пытался тоже не все понял. прошу ткнуть носом туда откуда я могу извлечь информацию по этому поводу

capzap
26.04.2017, 15:19
массив булевых переменных? Постарайтесь код построить иначе и проблем не будет

Scream
26.04.2017, 20:55
Мне не понятно если j = 5, а массив от 0 до 4, получается in_work[5] = invalid. Ведь 5го нет.

Гарчев Евгений
26.04.2017, 20:59
Значение в Bool-массиве соответствует значению в Dword-массиве, следовательно где-то в проекте происходит запись элементов Dword-массива в элементы Bool-массива.
Bool в CDS - это 8бит (1байт)
work_time[0]=50 - это и есть 16#32.
work_time[0]=1000 - это и есть 16#E8, точнее - 8-битный остаток от 1000 (16#E8 = 232 = 1000-256*3).

Указатели не используете?

Kostennikov
28.04.2017, 11:26
Указатели не использую.
вроде как без явного преобразования нельзя разные типы присваивать кроме случая когда один тип подмножество другого. т.е. дворду можно присвоить ворд но не наоборот. я не говорю что это именно так. но в функциональных языках было так.

Kostennikov
28.04.2017, 12:19
Мне не понятно если j = 5, а массив от 0 до 4, получается in_work[5] = invalid. Ведь 5го нет.
ну не знаю в моей практике всегда так было. первый цикл j = 0 , второй j = 1 , третий j = 2 , четвертый j = 3 , пятый j = 4 , потом значение j = 5 и выход из цикла т.к.
5 больше 4 т.е. всегда было так если условие цикла простое то сначала увеличивается счетчик а потом проверяется условие следовательно in_work[5] никогда такого не будет.30835

Kostennikov
28.04.2017, 13:12
не на выходе а на входе. следовательно
in_work[j] никогда не станет in_work[5]. исходя из этого за предел массива я не могу выйти. и была бы ошибка исполнения значение in_work[j] лежит за границей массива.

30841


я вам скрин прилепил. я как знал что будет такой пост.
на выходе если бы цикл repeat

Не может вы знаете какую-то тайну? и в контроллере все таки in_work[j] станет in_work[5] о чем мне и говорит среда?

capzap
28.04.2017, 13:21
использование CheckBounds, почитав документацию http://www.kipshop.ru/CoDeSys/steps/codesys_v23_ru.pdf с 333 страницы, разрешило бы спор. Но от него ни чего не изменится, с битами лучше работать не через массивы

Kostennikov
28.04.2017, 13:21
Bool в CDS - это 8бит (1байт) - действительно когда расширил до байта то проблема исчезла. тогда не понятно как в памяти это распределилось. подобных циклов и групп переменных 3 т.е. еще по два массива такой же размерности с подобными обработками проблема возникает только в этой группе.
work_time[0]=50 - это и есть 16#32.
work_time[0]=1000 - это и есть 16#E8, точнее - 8-битный остаток от 1000 (16#E8 = 232 = 1000-256*3). заметил еще вчера в запарке думал ошибка плавающая.

Kostennikov
28.04.2017, 13:35
использование CheckBounds, почитав документацию http://www.kipshop.ru/CoDeSys/steps/codesys_v23_ru.pdf с 333 страницы, разрешило бы спор. Но от него ни чего не изменится, с битами лучше работать не через массивы

значит разверну цикл и фиг с ним без массивов так без массивов

capzap
28.04.2017, 14:06
значит разверну цикл и фиг с ним без массивов так без массивов

SHR вполне может работать и внутри цикла

capzap
28.04.2017, 15:15
.. ничего не дало бы, т.к. CheckBounds с j=5 тупо не будет вызван в виду значений 0..4 для цикла.

так я же не против, вот и предлагаю були обрабатывать через смещение, хоть развернуто, хоть в цикле, в этом случае не пришлось бы напрягаться из-за какой то там красноты

capzap
28.04.2017, 15:27
решений на самом деле много, например если вместо индекса было бы выражение(например [0+j]), то КДС не стал бы показывать результаты и наверное тоже красноты бы не было и не надо было бы дописывать после цикла "зануление"