gifts2017

C++ (ATL) против METTLER-TOLEDO

Опубликовал AmoreMe (AmoreMe) в раздел Оборудование - Весы

Внешняя компонента для работы с периферией по RS-232. В моём случае это были весы!

C++ (ATL) против METTLER-TOLEDO

 

Стараясь быть кратким, но понятным сообщу, что потребовалось как-то мне заставить работать весы знаменитой фирмы «Mettler-Toledo» с  1С Предприятием 8.1 … Вариантов особых не было интерфейс (RS-232) и работа с COM портом. На весах взвешивают партии слитков из драгметалла. Компьютер, который планировалось задействовать для этой цели, не имел физических COM портов, но ситуацию спас преобразователь интерфейса USB<->COM.  Кстати, стоимость 2500 руб. Не так уж и много…

Чтобы не переносить данные из одной программы в другую (Ну это я о способе реализации), было принято решение выгружать полученный вес прямёхонько в  1С. Для этого будем писать внешнюю компоненту, в которой и реализуем весь функционал работы с последовательным портом, обработку команд весов, а надо сказать, командная строка этих METTLER довольно многообразна и обратную связь с 1С!

В результате этой разработки появилась универсальная .dll, которая позволяет в принципе работать с любым устройством , у которого есть возможность подключиться на последовательный порт и что либо туда писать.  А также обработка для подключения внешней компоненты и управления настройками COM порта…

Я уже видел как некоторые товарищи использовали bat файлы чтобы имитировать устройство на линии. Что сказать?! Это их право Laughing. Зачем делать сложным то,  что проще простого? Для начала просто поставим перемычку на 2-3 контакты, так мы сможем читать то, что сами отправили в порт…  Для первичной отладки сойдет! А вообще я использовал модем, ну кто мне даст весы стоимостью 300 тыс. руб.? Модем на моём ноутбуке прекрасно заменил оконечное устройство! Команда «wat» неизменно возвращала отклик «ОК!»,  «wat it» возвращала ответ Toshiba Software XXX.XX, где крестики модель устройства и код прошивки. ATDP XXX-XX-XX (крестики номер телефона) заставляла модем резво набирать предложенный номер! Любые данные записанные мной в порт и не распознанные модемом как команда отсылались обратно эхом!

Теперь некоторые замечания о внутреннем устройстве компоненты, написанной с использованием технологии СОМ. За основу был взят мой собственный шаблон, вернее правленый мной до рабочего состояния с диска ИТС и выложенный на известном всем ресурсе www.nowa.cc , кстати по просьбе трудящихся совсем недавно он был обновлён.  Кроме основного потока, создается поток чтения и находится в режиме ожидания события поступления в порт данных от устройства, а так же при записи команды в порт, создается поток записи, но этот сразу завершается после операции записи. То есть вы уже наверняка поняли, что мы используем асинхронные операции  чтения и записи! Это позволяет сделать наше приложение очень быстрым и не загружать процессор бессмысленной работой…

Лишь некоторые замечания по реализации кода «Внешнего события». Я обещал быть краток Laughing! Думаю у новичков вызовет затруднение один вопрос. А именно как реализовать в своем коде вызов внешнего события?! (если всё сделано правильно, 1С обязательно вызовет свои обработчики, уж поверьте…) Так вот, при инициализации компоненты обязательно присвойте значению глобального указателя на  IAsynchEvent  объявленного со спецификатором

 

 // Это глобальный указатель для реализации событий в файле AddIn.cpp

static IAsyncEvent *pAsyncEvent = NULL;

значение параметра  m_iAsyncEvent функции QueryInterface,

m_iAsyncEvent = NULL;

    pConnection->QueryInterface(IID_IAsyncEvent,(void **)&m_iAsyncEvent);  

      pAsyncEvent = m_iAsyncEvent;

далее в этом же классе объявите public функцию в которой через глобальный указатель, которому вы только что присвоили значение вызовите метод ВнешнееСобытие. Примерно так

void CAddIn::Event(BSTR Sourse, BSTR Message, BSTR Data)

{

      pAsyncEvent->ExternalEvent(Sourse, Message, Data);

}

Дальше в своем классе (у меня в шаблоне он MyClass)  объявите указатель на класс где вы присваивали значение глобальному указателю и добавляли функцию с вызовом обработчика внешнего события.

CAddIn* pAddIn;

Обязательно указатель, не пытайтесь создать объект не получится! Так как класс абстрактный, т.е. не все чистые виртуальные функции переопределены и реализованы! Не забудьте добавить в заголовочный файл своего класса заголовок класса на который мы объявляем указатель. Ну всё теперь в своем классе вы можете вызывать функцию абстрактного класса, передав ей нужные параметры, которая в свою очередь вызовет обработчик внешнего события в 1С!

После того как порт открыт установятся таймауты с такими значениями если вам это не подходит выберите нужные на вкладке настройка!

      CommTimeouts.ReadIntervalTimeout = MAXDWORD;

      CommTimeouts.ReadTotalTimeoutMultiplier = 0;

      CommTimeouts.ReadTotalTimeoutConstant = 0;

      CommTimeouts.WriteTotalTimeoutMultiplier = 0;

      CommTimeouts.WriteTotalTimeoutConstant = 0;

Важно: Перед тем как закрыть 1С убедитесь, что закрыли порт!!! Или хотя бы обработку, в этом случае она сама попробует закрыть порт… В противном случае реализуйте механизм закрытия порта при завершении работы системы или соответствующую проверку!

Предлагаемая внешняя обработка не является законченным решением и предназначена для демонстрации возможностей внешней компоненты.

P.S. Вот уже почти год как я занимаюсь разработкой и внедрением программного комплекса на базе 1С 8.1 Бухгалтерии, специфика учета оборота драгоценных металлов заставила реализовать невероятные схемы от которых по началу становилось просто муторно Innocent. Что-то удалось сразу и не требовало никаких доработок. Например, прием и обработка сырья. А вот бизнес процесс, который охватывает собой практически весь производственный цикл и сданный мной в работу ещё месяца три назад оказался слишком сложен для понимания операторов, не смогли освоить! И это явный промах Cry. К чему это я? Да просто всё… накопился ценный опыт работы в отрасли переработки драгметаллов, разумеется в сфере автоматизации документооборота и IT технологий! И я готов предложить его заинтересованным производственникам.

 

 

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Внешняя компонента
.dll 287,00Kb
07.11.09
189
.dll 287,00Kb 189 Скачать
Обработка для подключения
.epf 14,46Kb
07.11.09
88
.epf 14,46Kb 88 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Сергей (Che) Коцюра (CheBurator) 07.11.09 01:03
Понятно, что здорово, но здорово непонятно! ;-)
2. Андрей (AndrewEv) 07.11.09 08:30
перИферия, а не перЕферия
Для поиска по сайту лучше использовать правильную орфографию.
3. Артур Аюханов (artbear) 07.11.09 09:28
За работу с ВК несомненный плюс.
4. Валентин Терёхин (Valet) 07.11.09 10:13
Вариантов особых не было интерфейс (RS-232) и работа с COM портом

А Атолловские драйвера для весов? Сейчас специально посмотрел, поддерживаются: Toledo 8217 и Toledo Tiger E.
Или это совсем редкая модель весов?
5. AmoreMe (AmoreMe) 07.11.09 11:25
Для Tiger не нужны драйвера, бесплатно распространяется ПО которое работает с СОМ порторм напрямую (написано на C++ MFC), однако в нашем случае это не вариант был, хоть и пробовался :) . Не работает! Весы и правда редкие, специально для взвешивания слитков серебряно-золотого сплава! А потом если можем сами, почему этим не воспользоваться?! :)
6. Артур Пирожков (angler225) 10.11.09 18:01
А где собственно сам шаблон, выложенный на известном всем ресурсе www.nowa.cc? Не могу найти, помогите , плиз!
7. AmoreMe (AmoreMe) 10.11.09 19:27
Шаблон Депозит 8-) До конца ноября доступен для скачивания... (Ну вроде так на хосте заявлено!)
8. AmoreMe (AmoreMe) 10.11.09 19:32
9. AmoreMe (AmoreMe) 10.11.09 19:35
На "нове" что бы видеть закрытые разделы, а 1С именно такой!!! Обязательно нужно зарегистрироваться... :!:
10. Артур Пирожков (angler225) 11.11.09 11:10
Спасибо за шаблон!
У нас в конторе(завод по производству мясных полуфабрикатов) весы фирмы Scanvaegt. Вернее программный комплекс, но софт весь закрытый, поэтому есть идея подключить весы непосредственно к 1С, вот тут то и возникает проблема с драйверами для весов.
11. Артур Пирожков (angler225) 11.11.09 11:12
Спасибо за шаблон! У нас весы фирмы Scanvaegt. Нужно подключить их к 1С.
12. AmoreMe (AmoreMe) 11.11.09 12:20
Пожалуйста!
В любом случае dll вам очень поможет, вы можете использовать её, а можете написать свою. Хоть ПО на ваши весы и "закрыто", документация то на них у вас есть!? Вы все равно с её помощью увидите что отправляют в порт весы. и если это не шифрованные данные, а в случае с Меттлер это просто строки, то и обрабатывайте их как вам удобно! Напомню ещё раз, что в шаблоне нет реализации класса для работы с портом, не написан обработчик внешнего события, хоть я и объяснил как это сделать! :) Удачи!
13. krosaf4eg (krosaf4eg) 07.06.10 17:42
к сожалению, в 7.7 компонента не захотела адекватно работать. Пришлось по Вашему примеру написать свою.

Выложил компоненту, примеры и исходный код сюда
14. Konstantin _Konstantin (konfed) 08.06.10 10:24
Спасибо за dll, но не могу посмотреть шаблон - на Депозит - какая-то регистрация, зарегистрировался, но файла все равно нет.
15. krosaf4eg (krosaf4eg) 13.06.10 22:57
2 konfed, вообще-то все качается нормально, если ты брал вторую ссылку (8й комментарий). Но на всякий случай - лови зеркало: mediafire
16. Сергей Холопов ($erg) 07.09.11 15:00
Спасибо за обработку - работает. Конвертнул на 8.2 тоже сработало. Есть вопрос: если весы работают в режиме Continous - каким методом получать данные с порта?
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа