====== Подключение драйвера как DLL ====== ===== Общее описание ===== Настройте и проверьте связь с весами через программу "Программа настройки драйвера весов" (admin1CScales.exe). Если нет физического подключения к весам, то выберите тип весов "20:ЭМУЛЯТОР ВЕСОВ". UniproScalesComServer.dll - экспортирует 4 функции (Calling convention = **stdcall**). ^ Название функции ^ Параметры ^ Описание ^ | vr1 | нет |Загружает настройки с "settings.ini" - файл должен находиться в одной директории с UniproScalesComServer.dll. Нужно вызвать при запуске приложения. \\ Возвращает всегда 0.| | gw1| 5 параметров |Получает вес/цену/стоимость с весов.| | :::|[in] int **p_scales** | Номер весов, целое число (4 байта). Соответствует параметру "Номер весов в 1С" | | :::|[out] double **p_weight** | Значение массы, дробное число (8 байт). | | :::|[out] double **p_price**| Значение цены, дробное число (8 байт). Если весы не поддерживают = 0. | | :::|[out] double **p_cost**| Значение стоимости, дробное число (8 байт). Если весы не поддерживают = 0.| | :::|[out] int **p_stab**| Признак успокоения/стабильности веса, дробное число (4 байта). \\ 0-не стабильно \\ 1-стабильно \\ не все модели весов поддерживают.| | pp1| 2 параметра |Передача цены на весы. Не все модели весов поддерживают.| | :::|[in] int **p_scales** | Номер весов, целое число (4 байта). Соответствует параметру "Номер весов в 1С" | | :::|[in] int **p_price** | Цена в копейках, целое число (4 байта). | | pt1| 1 параметр |Нажатие на весах кнопки "ТАРА". Не все модели весов поддерживают.| | :::|[in] int **p_scales** | Номер весов, целое число (4 байта). Соответствует параметру "Номер весов в 1С" | Все функции возвращают значение типа int (целое 4 байта), варианты: ^Значение ^ Описание ^ | 0| Все ОК| | 1| Не возможно установить соединение с весами. \\ Если СОМ-порт: Убедитесь в правильности имени СОМ порта, возможно, он занят другим приложением. \\ Если Ethernet: \\ 1. Проверьте правильность указания IP-адреса и TCP-порта. \\ 2. Ethernet-переходник весов должен работать в режиме: TCP-Server. \\ 3. Возможно, блокирует соединение Брандмауэр(Firewall).| | 2| Ошибка в работе драйвера СОМ-порта.| | 3| Нет ответа от весов. Возможно: \\ 1. Проверьте правильность выбора типа весов, СОМ-порта и скорость СОМ-порта. \\ 2. Некоторые весы не передают вес, если он меньше ли равен НУЛЮ. \\ 3. На некоторых весах нужно настроить специальные параметры, чтоб узнать как настроить нажмите кнопку "Что нужно настроить в весах"в программе настройки драйвера. \\ 4. Соединительный кабель поврежден, отключен или распиновка неправильная (на СОМ-портовые кабеля нет стандартов, распиновку смотрите в программе настройки драйвера, клавиша "Что нужно настроить в весах") | | 4| Ошибка в цене, например число меньше нуля, или больше чем к-во разрядов на весах.| | 5| Текущий тип весов не поддерживает команду, например, не на все модели весов можно передать цену, или нажать "ТАРА". | | 6| Связь с весами ОК, но отсутствует лицензия на драйвер. Без лицензии можно получить вес в диапазонах: [80..110 г.] [2..3 кг.] [19..22 кг.] [95..105 кг.]| | 7| На весах "Перегруз". (Некоторые модели весов передают такую информацию)| | 8| Нет весов в settings.ini с указанным номером **p_scales**. Возникает если нет файла "settings.ini" или в нем нет такого номера весов. Возможно, не была вызвана функция "vr1". | Порядок вызовов функций: после загрузки UniproScalesComServer.dll в программу нужно вызвать функцию: **vr1**, после этого можно вызывать все другие функции (gw1, pp1, pt1) в любом порядке. ===== Пример на C# ===== using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Runtime.InteropServices; namespace scales_dll_csharp { class Program { // Load parameters from INI-file [DllImport("UniproScalesComServerWin32.dll", CallingConvention = CallingConvention.StdCall)] public static extern int vr1(); // get weight from scales [DllImport("UniproScalesComServerWin32.dll", CallingConvention = CallingConvention.StdCall)] public static extern int gw1(int p_scales, ref double p_weight, ref double p_price, ref double p_cost, ref int p_stab ); // send price [DllImport("UniproScalesComServerWin32.dll", CallingConvention = CallingConvention.StdCall)] public static extern int pp1(int p_scales, int p_price); // press "T" [DllImport("UniproScalesComServerWin32.dll", CallingConvention = CallingConvention.StdCall)] public static extern int pt1(int p_scales); static void Main(string[] args) { double lv_weight = 0; double lv_price = 0; double lv_cost = 0; int lv_stab = 0; int lv_res = 0; // Load parameters from INI-file vr1(); // send price lv_res = pp1(1, 12345); // get weight from scales number 1 lv_res = gw1( 1, ref lv_weight, ref lv_price, ref lv_cost, ref lv_stab); if (lv_res == 0) { Console.WriteLine("res={0:D} weight={1:F}; price={2:F}; cost={3:F}; stab={4:D}", lv_res, lv_weight, lv_price, lv_cost, lv_stab); } else { Console.WriteLine("Error={0:D}", lv_res); } // press T lv_res = pt1(1); Console.ReadLine(); } } } ===== Пример на Delphi ===== unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type TForm1 = class(TForm) Memo1: TMemo; ButtonGetWeight: TButton; ButtonPressTara: TButton; ButtonSendPrice: TButton; EditPrice: TEdit; procedure ButtonGetWeightClick(Sender: TObject); procedure ButtonPressTaraClick(Sender: TObject); procedure ButtonSendPriceClick(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } res1 :Int32; public { Public declarations } end; function scalesdll_Init(): integer; stdcall; external 'UniproScalesComServerWin32.dll' name 'vr1'; function scalesdll_GetWeight( p_Num:Int32; var p_weight:Double; var p_price:Double; var p_cost:Double; var p_stab:Int32 ): integer; stdcall; external 'UniproScalesComServerWin32.dll' name 'gw1'; function scalesdll_SendPrice( p_Num:Int32; p_Price:Int32 ): integer; stdcall; external 'UniproScalesComServerWin32.dll' name 'pp1'; function scalesdll_PressTara( p_Num:Int32 ): integer; stdcall; external 'UniproScalesComServerWin32.dll' name 'pt1'; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin scalesdll_Init(); end; procedure TForm1.ButtonGetWeightClick(Sender: TObject); var lv_weight, lv_price, lv_cost:Double; lv_stab :Int32; begin res1 := scalesdll_GetWeight( 1, lv_weight, lv_price, lv_cost, lv_stab ); if res1 <> 0 then Memo1.Lines.Add( 'Error:'+IntToStr(res1) ) else Memo1.Lines.Add( 'Вес:'+FloatToStr(lv_weight) +'; Цена:'+FloatToStr(lv_price) +'; Стоимость:'+FloatToStr(lv_cost) +'; Стабильно:'+IntToStr(lv_stab) ); end; procedure TForm1.ButtonPressTaraClick(Sender: TObject); begin res1 := scalesdll_SendPrice( 1, StrToInt(EditPrice.Text) ); if res1 <> 0 then Memo1.Lines.Add( 'Error:'+IntToStr(res1) ); end; procedure TForm1.ButtonSendPriceClick(Sender: TObject); begin res1 := scalesdll_PressTara( 1 ); if res1 <> 0 then Memo1.Lines.Add( 'Error:'+IntToStr(res1) ); end; end. ===== Пример на C++ ===== #include #include typedef long(__stdcall *dllScalesInit)(); typedef long(__stdcall *dllScalesGetWeight)(int p_scales, double & p_weight, double & p_price, double &p_cost, long &p_stab); typedef long(__stdcall *dllScalesSendPrice)(int p_scales, int p_price); typedef long(__stdcall *dllScalesPressT)(int p_scales); ///////////////////////////// // Global variables HMODULE global_hLib; dllScalesInit global_ScalesInit; dllScalesGetWeight global_ScalesGetWeight; dllScalesSendPrice global_ScalesSendPrice; dllScalesPressT global_ScalesPressT; int main() { global_hLib = LoadLibrary("UniproScalesComServerWin32.dll"); if (global_hLib == NULL) { printf("Error load DLL."); return 1; } global_ScalesInit = (dllScalesInit)GetProcAddress(global_hLib, "vr1"); global_ScalesGetWeight = (dllScalesGetWeight)GetProcAddress(global_hLib, "gw1"); global_ScalesSendPrice = (dllScalesSendPrice)GetProcAddress(global_hLib, "pp1"); global_ScalesPressT = (dllScalesPressT)GetProcAddress(global_hLib, "pt1"); if ( !global_ScalesInit || !global_ScalesGetWeight || !global_ScalesSendPrice || !global_ScalesPressT) { printf("Error load functions from DLL."); return 2; } global_ScalesInit(); int res1 = 0; double lv_weight; double lv_price; double lv_cost; long lv_stab; res1 = global_ScalesSendPrice(1, 12345); if (res1) printf("Error: %d\r\n", res1); res1 = global_ScalesGetWeight(1, lv_weight, lv_price, lv_cost, lv_stab); if (!res1) { printf("Weight: %6.3f; Price:%6.2f; Cost: %6.2f; Stab: %d.\r\n", lv_weight, lv_price, lv_cost, lv_stab); } else { printf("Error: %d\r\n", res1); } res1 = global_ScalesPressT(1); if (res1) printf("Error: %d\r\n", res1); FreeLibrary(global_hLib); printf("Press [ENTER]\r\n"); getchar(); return 0; }