?

Log in

No account? Create an account

Программирование весов Mettler Toledo Tiger P

Привезли нам на работе новые весы. Нормальные такие весы самообслуживания, симпатичные. Обычно на наших магазинах используется Mettler Toledo Tiger 8442-3600, а эти - Mettler Toledo 8442-3610S. Принципиально, разницы никакой нет, с программной части они одинаковые, кроме пары пунктов. У 3610S клавиатура по умолчанию находится в режиме выбора товара, и как добраться до настроек - непонятно. С этим разбирались 2 дня. Оказалось - надо весы выключить, нажать CODE, весы включить, держать CODE до посинения, пока не появится приглашение ввести код. Ладно. Настроили IP, накатили через SPCT торговые настройки, прогрузили товар. А как кнопки для покупателя программировать? Ну да, можно через ту же SPCT. Но, например, 25-кнопочная раскладка клавиатуры подразумевает, что 1 кнопка занимает 4 места на клавиатуре, стало быть, нужно выгружать привязку товара к кнопке 4 раза. Для тётушек на магазинах такая математика сложнее высшей алгебры. Пришлось браться за перо, точнее, за любимый Delphi. Еще дней 5 я вкуривал в сандартный драйвер, предоставляемый Mettler Toledo. И вот что оказалось:
Нам нужна кучка библиотек драйвера (ну, найти - проблемы не составляет). Как он действует:
Файл ScaleAddress.ini содержит адреса-порты весов.
Файл TransScale.ini содержит номер весов (из ScaleAddress.ini) и имя файла с командой (обычно trf.out).
Файл trf.out содержит, собственно, команду. Описание этих команд есть в "описании протокола обмена данными Tiger P", не буду разоряться на объяснение. Скажу только, что команда выглядит как 000216000000010009900000004530000000000, где 099 - номер места на клавиатуре (по 100-кнопочной раскладке), а 000453 - это номер PLU. То есть, этой командой у нас привяжется PLU №000453 к кнопке №99. Если используется, например, 25-кнопочная клавиатура, нам нужно выгрузить эту команду для кнопок №1, 2, 11 и 12. То есть, 4 выгрузки подряд:
000216000000010000100000004530000000000
000216000000010000200000004530000000000
000216000000010001100000004530000000000
000216000000010001200000004530000000000
Я каждый раз переписывал trf.out, мне так показалось лучше. С записью в файл, я думаю, читающие справятся... Обратим внимание, что если соберетесь выгружать кириллицу - ее нужно набирать в DOS-кодировке.

По поводу того, как подключить драйвер к делфе - отдельная эпопея. В описании сказано, что нужно вызвать функцию ireturn = Transfer_Ethernet_EX("Transscale.ini",251245664). В реале, оказалось, ее зовут _Transfer_Ethernet_EX@8. Подчерк, собачка и "8" в имени функции - я так понимаю, name mangling, результат работы Си при компиляции библиотеки. Короче, вызов у меня выглядел так:

<code>
procedure UploadTRF;
type
Transfer_Ethernet_EX = procedure(cTrfTxtout: PChar; Key: integer); stdcall;

var
LibHandle: THandle;
TransferProc: Transfer_Ethernet_EX;

begin
@TransferProc := nil;
LibHandle := LoadLibrary('TransferEth.dll');
@TransferProc := GetProcAddress(LibHandle, '_Transfer_Ethernet_EX@8');
if @TransferProc <> nil then TransferProc('Transscale.ini', 251245664);
FreeLibrary(LibHandle);
end;
</code>

Такой вот сумбурный набросок-памятка получился...

Comments