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

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


подключить-как-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 Ошибка в цене, например число меньше нуля, или больше чем к-во разрядов на весах.
5 Текущий тип весов не поддерживает команды, например, не на все типы моделей можно передать цену, или нажать «ТАРА».
6 Связь с весами ОК, но отсутствует лицензия на драйвер. Без лицензии можно получить вес в диапазонах: [80..110 г.] [2..3 кг.] [19..22 кг.] [95..105 кг.]
7 На весах «Перегруз». (Некоторые модели весов передают такую информацию)
8 Нет весов в settings.ini с указанным номером p_scales. Возникает если нет файла «settings.ini» или в нем нет такого номера весов.

Порядок вызовов функций: после загрузки 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("UniproScalesComServer.dll", CallingConvention = CallingConvention.StdCall)]
        public static extern int vr1();
 
        // get weight from scales
        [DllImport("UniproScalesComServer.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("UniproScalesComServer.dll", CallingConvention = CallingConvention.StdCall)]
        public static extern int pp1(int p_scales, int p_price);
 
        // press "T"
        [DllImport("UniproScalesComServer.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 'UniproScalesComServer.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 'UniproScalesComServer.dll' name 'gw1';
 
function scalesdll_SendPrice(
                  p_Num:Int32;
                  p_Price:Int32
                  ): integer; stdcall; external 'UniproScalesComServer.dll' name 'pp1';
 
function scalesdll_PressTara(
                  p_Num:Int32
                  ): integer; stdcall; external 'UniproScalesComServer.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.
подключить-как-dll-через-loadlibrary.1586974024.txt.gz · Последние изменения: 2020/04/15 21:07 — iserbin