Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 15

Тема: Как получить переменную int64 со сканера штрих-кода ?

  1. #1

    По умолчанию Как получить переменную int64 со сканера штрих-кода ?

    Всем привет.
    Необходимо получать от сканера штрих-кодов значения. Но непонятно как передавать по Mod-Bus большие величины.
    Объясню по подробнее:
    1. Оператор сканирует штрих-код.
    2. Т.к. сканнер не имеет своего протокола обмена высокого уровня, то он просто асинхронно выбрасывает распознанный штрих в символах 0..9 (!) и после эмулирует нажатие клавиши Enter (h0D).
    3. Штрих-код ловится спец.устройством собственной разработки - "Bridge Scanner-PLC" - и хранится во временной памяти. Этот bridge может принимать асинхронно данные от 8 сканеров штрих-кодов.
    4. Штрих-код преобразуется из последовательности символов 0..9 в последовательность цифр 0..9.
    5. ПЛК сканирует регистры внутри Bridge через шину mod-bus. Тут возникает проблема - регистры в mod-bus двух-байтные. А Bridge хочет выдать гигантское число - 4811620472025 (штрих-код в формате EAN13).
    6. Для совместимости с mod-bus сейчас реализовано так, что Bridge разделяет свое гигантское число на 4 регистра mod-bus со значениями: 0004, 8116, 2047 и 2025 соответственно (штрих-код из п.5).

    Вопрос знатокам:
    Как потом собрать это число в ПЛК в одно единое int64 ?
    Правильно ли всё это? Может есть пути попроще?
    Есть ли уже готовые решения?
    Последний раз редактировалось ВладОвен; 26.04.2022 в 18:55. Причина: дополнение

  2. #2
    Пользователь Аватар для A.Simonov
    Регистрация
    11.07.2017
    Адрес
    Москва
    Сообщений
    623

    По умолчанию

    Цитата Сообщение от ВладОвен Посмотреть сообщение
    Всем привет.
    Необходимо получать от сканера штрих-кодов значения. Но непонятно как передавать по Mod-Bus большие величины.
    Объясню по подробнее:
    1. Оператор сканирует штрих-код.
    2. Т.к. сканнер не имеет своего протокола обмена высокого уровня, то он просто асинхронно выбрасывает распознанный штрих в символах 0..9 (!) и после эмулирует нажатие клавиши Enter (h0D).
    3. Штрих-код ловится спец.устройством собственной разработки - "Bridge Scanner-PLC" - и хранится во временной памяти. Этот bridge может принимать асинхронно данные от 8 сканеров штрих-кодов.
    4. Штрих-код преобразуется из последовательности символов 0..9 в последовательность цифр 0..9.
    5. ПЛК сканирует регистры внутри Bridge через шину mod-bus. Тут возникает проблема - регистры в mod-bus двух-байтные. А Bridge хочет выдать гигантское число - 4811620472025 (штрих-код в формате EAN13).
    6. Для совместимости с mod-bus сейчас реализовано так, что Bridge разделяет свое гигантское число на 4 регистра mod-bus: 0004, 8116, 2047 и 2025 соответственно (штрих-код из п.5).

    Вопрос знатокам:
    Как потом собрать это число в ПЛК в одно единое int64 ?
    Правильно ли всё это? Может есть пути попроще?
    Есть ли уже готовые решения?
    Добрый день.

    А почему именно в число собрать хотите?
    Соберите в строку STRING.

    Александр Андреевич Симонов
    Инженер по продуктам «ПЛК, модули и OwenCloud»

    Не работаю в ОВЕН с 01.07.22
    По всем вопросам обращайтесь на почту: support@owen.ru

  3. #3

    По умолчанию

    Цитата Сообщение от A.Simonov Посмотреть сообщение
    А почему именно в число собрать хотите?
    Соберите в строку STRING.
    Я думал об этом.
    Мне кажется с числами проще: можно диапазоны задавать, со строкой было бы, наверное, потруднее.

    Перевод из символов и цифры реализован хорошо. Он работает нормально.
    Но это не решает проблему передачи большого числа / длинной строки через протокол mod-bus.

    Или строку как-то можно разбивать / передавать / собирать через mod-bus ?

  4. #4
    Пользователь Аватар для A.Simonov
    Регистрация
    11.07.2017
    Адрес
    Москва
    Сообщений
    623

    По умолчанию

    Цитата Сообщение от ВладОвен Посмотреть сообщение
    Я думал об этом.
    Мне кажется с числами проще: можно диапазоны задавать, со строкой было бы, наверное, потруднее.

    Перевод из символов и цифры реализован хорошо. Он работает нормально.
    Но это не решает проблему передачи большого числа / длинной строки через протокол mod-bus.

    Или строку как-то можно разбивать / передавать / собирать через mod-bus ?
    Ну вы ни какую конкретику не приводите, поэтому сложно говорить.
    Но сам протокол MODBUS передает просто байты, он не вкурсе строка это или число.
    В этом смысле, за один обмен пакетами — нет ни каких проблем передать набор байт любой длины, который укладывается в размер фрейма (256 байт, вместе с заголовками).
    А что вы будете делать с байтами, например, собирать их в числа или строки — уже не зона ответственности протокола.
    Последний раз редактировалось A.Simonov; 26.04.2022 в 11:45.

    Александр Андреевич Симонов
    Инженер по продуктам «ПЛК, модули и OwenCloud»

    Не работаю в ОВЕН с 01.07.22
    По всем вопросам обращайтесь на почту: support@owen.ru

  5. #5

    По умолчанию

    Вырисовывается такой вариант:
    Объявить переменную типа ulint. Это целое беззнаковое число на 8 байт в памяти. В такую переменную запросто должен влезть штрихкод EAN13 (13 цифр).
    А в ПЛК собирать эту переменную из 4-х двухбайтовых регистров mod-bus можно так:

    uliKod := ( iReg4 * 10000 0000 0000 ) + ( iReg3 * 10000 0000 ) + ( iReg2 * 10000 ) + ( iReg1 * 1 ) ;

    И тогда будет штрих-код 4811620472025, собранный из регистров: 0004 8116 2047 2025.

    Вопрос к знатокам: это преобразование правильно делать тупо в программе PLC_PRG ? Или же можно как-то это оформить во время объявления переменной и система будет автоматически делать преобразование? (просто не хочется усложнять/загромождать основной код PCL_PRG).
    Последний раз редактировалось ВладОвен; 26.04.2022 в 18:56.

  6. #6
    Пользователь
    Регистрация
    27.11.2011
    Адрес
    Краснодар
    Сообщений
    10,583

    По умолчанию

    Не все ПЛК работают с Long или LReal насколько помню.

    Если уж вы разрезали число для передачи по Modbus, то и склеить обратно можно, главное чтобы клеяльщик умел работать с 8-ми байтными переменными... 100, 150, 154 точно не умеют, как и 63/73
    Последний раз редактировалось melky; 26.04.2022 в 13:04.

  7. #7

    По умолчанию

    Цитата Сообщение от melky Посмотреть сообщение
    Не все ПЛК работают с Long или LReal насколько помню.
    Точно! Мой ПЛК не работает с ulint!
    Посмотрите, как идет умножение (42 * 100000000) и (43 * 100000000)

    wtf1.png

    Значит нужно работать со string.
    Последний раз редактировалось ВладОвен; 26.04.2022 в 14:15.

  8. #8

    По умолчанию

    ИМХО лучше STRING: потому что там же последняя цифра - контрольная, и её можно проверять по алгоритму, проверяя корректность самого кода.
    А, если есть какие-то спецзадачи (у меня по штрих-коду в CS CRM документы и товары ищутся), то надо отдельно смотреть на первые 1-3 цифры. Например, если в штрих-коде первая цифра "2" - то это или весовой штрих-код или внутренний (не международный).
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net

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

    По умолчанию

    Цитата Сообщение от ВладОвен Посмотреть сообщение
    Точно! Мой ПЛК не работает с ulint!
    Посмотрите, как идет умножение (42 * 100000000) и (43 * 100000000)

    wtf1.png

    Значит нужно работать со string.
    По скрину четкое ощущение, что у вас uliY объявлен как UDINT, а не ULINT.
    Не готов поверить, что у RealLab нет поддержки 64-битных целых.

  10. #10

    По умолчанию

    Да. А может подскажете как собрать такую переменную?

    Я пробовал передавать первые две цифры штрих-кода в регистре. Соотносил их с переменными в среде CodeSys. Потом функция TO_STRING делала эти переменные символьными, но не символами ASCII с нужными кодами.
    Т.е. Первые две цифры штрих-кода 4 и 8. Они передаются через mod-bus как h04 и h08. Падают в переменную word - h408. Это десятичное число 1032. После TO_STRING я вижу строковую переменную - '1032'.
    А хочу видеть '48'.

    Что я делаю не так?
    Последний раз редактировалось ВладОвен; 26.04.2022 в 16:28.

Страница 1 из 2 12 ПоследняяПоследняя

Похожие темы

  1. Штрих коды как грамотнее все сделать?
    от жекон в разделе Трёп (Курилка)
    Ответов: 4
    Последнее сообщение: 12.10.2021, 14:31
  2. Ответов: 21
    Последнее сообщение: 24.03.2020, 18:29
  3. Ответов: 18
    Последнее сообщение: 27.02.2018, 20:09
  4. Ввод в MasterSCADA со сканера штрих-кода
    от Terminat в разделе Master SCADA 3
    Ответов: 5
    Последнее сообщение: 14.11.2014, 16:35
  5. подключение сканера штрихкода
    от Александр N в разделе Подбор Оборудования
    Ответов: 2
    Последнее сообщение: 02.11.2014, 13:22

Метки этой темы

Ваши права

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