====== Подключение драйвера как 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;
}