Отличное видео, спасибо! Кстати, если при решении подобных задач у испытуемого не возникает затруднений, то его можно попросить оптимизировать свой код. Это может дать дополнительную информацию о нём. Например, в данной задаче первый цикл можно сократить до трёх проходов и убрать "IF", во втором цикле убрать вложенность, а также избавиться от двух массивов и некоторых строк кода: IF xDoIt THEN sMaskBuffer := sMask; dwMask := 0; FOR i := 1 TO 3 DO iDotPos := FIND(sMaskBuffer, '.'); dwMask := SHL(dwMask OR TO_DWORD(LEFT(sMaskBuffer, iDotPos - 1)), 8); sMaskBuffer := DELETE(sMaskBuffer, iDotPos, 1); END_FOR dwMask := (dwMask OR TO_DWORD(sMaskBuffer)); byBitOnMask := 0; FOR i := 0 TO 31 DO byBitOnMask := byBitOnMask + BOOL_TO_BYTE(dwMask.0); dwMask := SHR(dwMask, 1); END_FOR sCidr := CONCAT(CONCAT(sIp, '/'), TO_STRING(byBitOnMask)); xDoIt := FALSE; END_IF
так и задумано - на контрасте очень интересно посмотреть на решение одной и той же задачи на разных языках. =) Плюс можно обсудить концептуальные отличия Python и ST, парадигмы программирования и т.д.
В CDS, после заполнения стрингового массива asOctets, как вариант далее - DEC_TO_DWORD, далее BIT_COUNT, далее снова Ваш код. Давать соискантам возможность обнаружить свой кругозор, (на примере того же OSCAT BASIC) - не есть плохо.
да, вы, безусловно, правы. Строго говоря, опечатка в исходном значении sIp - должно быть '192.168.0.10' - это заводской IP-адрес наших контроллеров. Я только к концу видео заметил эту опечатку, к сожалению. =(
Здравствуйте. Очень хотелось бы увидеть инструкцию по управлению двигателем с помощью ПЧ AFD-L. Проблема с управлением пуском и остановом. В шаблоне значения состояний имеют тип UINT. Есть блок в библиотеке, который расшифровывает значения UINT. Но блок в проект CFC добавить нельзя. Чтобы отдельными BOOL переменными переключать состояния. С разрешением быть включенной только одному состоянию. Как это реализовать? Спасибо
Добрый день. Не очень понятно, о каком блоке речь. В данном ПЧВ нет командного слова, состоящего из битов (я понимаю, что в других ПЧВ оно часто встречается). Но в AFD-L нужно управлять частотчником отдельныим командами - записывайте ее в канал Команда работы и генерируйте единичный импульс в канале Запись команды работы. Если я не до конца ответил на ваш вопрос - задайте его пожалуйста, на нашем форуме, приложив к вопросу пояснительные скриншоты: owen.ru/forum/showthread.php?t=20069&page=570
Да задачка увлекательная, подобную недавно решал для связки разномастных контроллеров на одну панель- передать несколько различных параметров в ОДНОМ формате... Который пришлось ещё изобрести🤪 И маленькая поправка к ( th-cam.com/video/uXga71rTo4M/w-d-xo.html ) В байте принято считать ВОСЕМЬ бит... Застал системы где было и пять бит ...
Я понимаю, что вы имеете в виду, но системы, где 1 байт не равен 8 бит в настоящее время интересны только с исторической и "пытливой" точки зрения, как мне кажется (на уровне рассуждений о формальном определении размера CHAR в спецификации ANSI C, макроса CHAR_BIT в limits.h и т. д.).
Собственно, там сдвига не происходит. Так как к этому моменту строка уже разбита на 4 подстроки - мы просто проходимся по ним в цикле FOR с i от 0 до 3.
Отличный разбор, спасибо. Предлагаю чаще разбирать подобные задачки
Отличное видео, спасибо! Кстати, если при решении подобных задач у испытуемого не возникает затруднений, то его можно попросить оптимизировать свой код. Это может дать дополнительную информацию о нём. Например, в данной задаче первый цикл можно сократить до трёх проходов и убрать "IF", во втором цикле убрать вложенность, а также избавиться от двух массивов и некоторых строк кода:
IF xDoIt THEN
sMaskBuffer := sMask;
dwMask := 0;
FOR i := 1 TO 3 DO
iDotPos := FIND(sMaskBuffer, '.');
dwMask := SHL(dwMask OR TO_DWORD(LEFT(sMaskBuffer, iDotPos - 1)), 8);
sMaskBuffer := DELETE(sMaskBuffer, iDotPos, 1);
END_FOR
dwMask := (dwMask OR TO_DWORD(sMaskBuffer));
byBitOnMask := 0;
FOR i := 0 TO 31 DO
byBitOnMask := byBitOnMask + BOOL_TO_BYTE(dwMask.0);
dwMask := SHR(dwMask, 1);
END_FOR
sCidr := CONCAT(CONCAT(sIp, '/'), TO_STRING(byBitOnMask));
xDoIt := FALSE;
END_IF
скажите, как вот эта строка работает?
dwMask := SHL(dwMask OR TO_DWORD(LEFT(sMaskBuffer, iDotPos - 1)), 8);
зачем там OR?
На питоне такую задачу рассматривать не спортивно.
А вот на ST эта простая вещь превращается в увлекательное приключение ))
так и задумано - на контрасте очень интересно посмотреть на решение одной и той же задачи на разных языках. =)
Плюс можно обсудить концептуальные отличия Python и ST, парадигмы программирования и т.д.
@@CodesysOneLove а в функциональном программировании тоже есть парадигмы, или они только в ООП?
@@Эрик-щ7н и то, и то другое - это и есть парадигмы.
@@CodesysOneLove Да? спасибо, не знал
я думал, что парадигмы - это инкапсуляция, наследование и так далее
В CDS, после заполнения стрингового массива asOctets, как вариант далее - DEC_TO_DWORD, далее BIT_COUNT, далее снова Ваш код. Давать соискантам возможность обнаружить свой кругозор, (на примере того же OSCAT BASIC) - не есть плохо.
Как всегда отличное видео!
Попробуйте выполнить программму более одного раза. byBitOnMask хорошо бы обнулять не на этапе объявления. Спасибо за ролик.
Спасибо, совершенно справедливое замечание.
Ожидаем 192.168.10/16, а результат 192.16.10/16 - вторые октеты отличаются. В ожидаемом результате опечатка.
да, вы, безусловно, правы. Строго говоря, опечатка в исходном значении sIp - должно быть '192.168.0.10' - это заводской IP-адрес наших контроллеров. Я только к концу видео заметил эту опечатку, к сожалению. =(
Здравствуйте. Очень хотелось бы увидеть инструкцию по управлению двигателем с помощью ПЧ AFD-L. Проблема с управлением пуском и остановом. В шаблоне значения состояний имеют тип UINT. Есть блок в библиотеке, который расшифровывает значения UINT. Но блок в проект CFC добавить нельзя. Чтобы отдельными BOOL переменными переключать состояния. С разрешением быть включенной только одному состоянию. Как это реализовать? Спасибо
Добрый день. Не очень понятно, о каком блоке речь. В данном ПЧВ нет командного слова, состоящего из битов (я понимаю, что в других ПЧВ оно часто встречается). Но в AFD-L нужно управлять частотчником отдельныим командами - записывайте ее в канал Команда работы и генерируйте единичный импульс в канале Запись команды работы. Если я не до конца ответил на ваш вопрос - задайте его пожалуйста, на нашем форуме, приложив к вопросу пояснительные скриншоты: owen.ru/forum/showthread.php?t=20069&page=570
Да задачка увлекательная, подобную недавно решал для связки разномастных контроллеров на одну панель- передать несколько различных параметров в ОДНОМ формате... Который пришлось ещё изобрести🤪
И маленькая поправка к ( th-cam.com/video/uXga71rTo4M/w-d-xo.html ) В байте принято считать ВОСЕМЬ бит... Застал системы где было и пять бит ...
Я понимаю, что вы имеете в виду, но системы, где 1 байт не равен 8 бит в настоящее время интересны только с исторической и "пытливой" точки зрения, как мне кажется (на уровне рассуждений о формальном определении размера CHAR в спецификации ANSI C, макроса CHAR_BIT в limits.h и т. д.).
Как делается сдвиг выделенных строк в сторону как на 23 минуте 16 сек?
Собственно, там сдвига не происходит. Так как к этому моменту строка уже разбита на 4 подстроки - мы просто проходимся по ним в цикле FOR с i от 0 до 3.
Я имел ввиду в редакторе ST как сдвинуть выделенные строки. А не каждую по отдельности, например TABулировать
@@ДмитрийФримен-щ5т а, точно так же - выделить несколько строк и нажать TAB.
Это так на столько элементарно ))) попробую