Инструменты пользователя

Инструменты сайта


подключить-как-dll-через-loadlibrary

Подключение драйвера как 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 <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;
}
подключить-как-dll-через-loadlibrary.txt · Последние изменения: 2020/04/18 00:01 — iserbin