Настройте и проверьте связь с весами через программу «Программа настройки драйвера весов» (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) в любом порядке.
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(); } } }
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.
#include <windows.h> #include <stdio.h> 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; }