вторник, 31 марта 2015 г.

Описание API вызова библиотеки CI5010RS422.DLL

Данная библиотека (далее DLL) предназначена для работы с весовым терминалом CI-5010A по сети RS-422/485 или RS-232 через физический или виртуальный СOM-порт over USB в ОС NT/2000/2003/XP/Vista/7/8, и осуществляет чтение и декодирование данных о режиме работы, весе брутто-нетто, номере устройства, значении и знаке веса, единиц измерения и признаков индикаторов. Восстановление связи при использовании виртуального последовательного порта осуществляется автоматически.


 

Протокол:



Cистемные требования и зависимости:
  1. Windows XP/Vista/7/8/8.1.
  2. Наличие виртуального или физического COM-порта over RS-485 (конвертор RS-485/USB/RS-232).
  3. Весовой терминал CI5010А.
  4. Двухпроводная диффлиния RS-422/485 или RS-232.
DLL предоставляет универсальный доступ для других приложений вне зависимости от языка в среде Win OS. Для использования DLL в своих проектах соблюдайте соглашение об stdcall-вызовах. Тип соглашения о вызове объявляется после прототипа функции, будь то объявление функционального типа или же объявление функции.

Таблица расшифровок параметров экспортируемой функции 'reinit()' библиотеки:


 Таблица расшифровок параметров экспортируемой функции 'getdata()' библиотеки:


Пример динамического подключения (Delphi 6/7/2006/2009/2010/TDL/XE5):
var en_com: boolean;
    getdata:function(var mode,              // mode work
                     weight,                // weight brutto/netto
                     weightu: pansichar;    // weight unit
                     var numdevice,         // number device
                     stable,                // bit 6 - STABLE
                     high,                  // bit 5 - HIGH
                     loww,                  // bit 4 - LOW
                     hold,                  // bit 3 - HOLD
                     gross,                 // bit 2 - GROSS
                     tare,                  // bit 1 - TARE
                     zero:                  // bit 0 - ZERO
                     byte;
                     var value: double;     // value
                     var gl_count: integer  // number of packets
                     ): pansichar;          // status
                     stdcall;
    reinit:function(comnum: byte; baud: integer; enable, log: boolean): boolean; stdcall;

    LibHandle: THandle;


function LinkProc(ProcName: string):Pointer;
begin
 result:= GetProcAddress(LibHandle,PChar(ProcName))
end;


{ инициализация }
 LibHandle:= LoadLibrary('CI5010RS422.dll');
 if LibHandle<>0 then begin
  getdata:= LinkProc('getdata');
  reinit := LinkProc('reinit');

  reinit(1 {COM1}, 9600, true, true);
 end;

...


{ деинициализация }
 if LibHandle<>0 then begin
  reinit(0, 0, false, false);
  freelibrary(LibHandle)
 end;
...


{ чтение данных }
var mode: pansichar;   // mode work
    weight: pansichar; // weight brutto/netto
    weightu: pansichar;// weight unit
    numdevice,         // number device
    stable,            // bit 6 - STABLE
    high,              // bit 5 - HIGH
    loww,              // bit 4 - LOW
    hold,              // bit 3 - HOLD
    gross,             // bit 2 - GROSS
    tare,              // bit 1 - TARE
    zero:              // bit 0 - ZERO
    byte;
    value: double;     // value
    gl_count: integer; // number of packets
begin
 if en_com then begin
  statusbar1.panels[0].Text:= 'connected!';

  getdata(mode,
          weight,
          weightu,
          numdevice,
          stable,
          high,
          loww,
          hold,
          gross,
          tare,
          zero,
          value,
          gl_count);

  list.Cells[1, 1] := mode;
  list.Cells[1, 2] := weight;
  list.Cells[1, 3] := format('%d', [numdevice]);
  list.Cells[1, 4] := format('%d', [stable]);
  list.Cells[1, 5] := format('%d', [high]);
  list.Cells[1, 6] := format('%d', [loww]);
  list.Cells[1, 7] := format('%d', [hold]);
  list.Cells[1, 8] := format('%d', [gross]);
  list.Cells[1, 9] := format('%d', [tare]);
  list.Cells[1, 10]:= format('%d', [zero]);
  list.Cells[1, 11]:= format('%f', [value]);
  list.Cells[1, 12]:= weightu;
  list.Cells[1, 13]:= format('%d', [gl_count]);
 end else begin
  statusbar1.panels[0].Text:= 'not connected...';

  list.Cells[1, 1] := '';
  list.Cells[1, 2] := '';
  list.Cells[1, 3] := '';
  list.Cells[1, 4] := '';
  list.Cells[1, 5] := '';
  list.Cells[1, 6] := '';
  list.Cells[1, 7] := '';
  list.Cells[1, 8] := '';
  list.Cells[1, 9] := '';
  list.Cells[1, 10]:= '';
  list.Cells[1, 11]:= '';
  list.Cells[1, 12]:= '';
  list.Cells[1, 13]:= '';
...
Пример использования библиотеки из под C++ Builder:
// ГЛОБАЛЬНЫЕ ---------------------------------------------------------------

HINSTANCE LibHandle;

// описываем прототипы функции согласно соглашению STDCALL (см. мое описание)
typedef void (__stdcall *getdata)(unsigned char *& mode,
                                  unsigned char *& weight,
                                  unsigned char *& weightu,
                                  byte & numdevice,
                                  byte & stable,
                                  byte & high,
                                  byte & loww,
                                  byte & hold,
                                  byte & gross,
                                  byte & tare,
                                  byte & zero,
                                  double & vvalue,
                                  int & glcount);

typedef void (__stdcall *reinit)(byte comnum,
                                 int baud,
                                 boolean enable,
                                 boolean log);

FARPROC agetdata;
FARPROC areinit;



unsigned char * mode;
unsigned char * weight;
unsigned char * weightu;
byte numdevice;
byte stable;
byte high;
byte loww;
byte hold;
byte gross;
byte tare;
byte zero;
double vvalue;
int glcount;


//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
 LibHandle = LoadLibrary("test\\CI5010RS422.dll"); // указание отн.пути в билдере
 if (LibHandle!=0) {
  agetdata = GetProcAddress(LibHandle, "getdata");
  areinit = GetProcAddress(LibHandle, "reinit");

  ((reinit)areinit)(5,
                    9600,
                    true,
                    true);
  Form1->Caption = "ok";
 }

}


//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
if (LibHandle) {
  // деактивируем поток захвата
  ((reinit)areinit)(5,
                    9600,
                    false,
                    false);

  FreeLibrary(LibHandle);
  }
   
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
if (LibHandle!=0) {
  // визуализация
  Memo1->Clear();

  ((getdata)agetdata)(mode,
                      weight,
                      weightu,
                      numdevice,
                      stable,
                      high,
                      loww,
                      hold,
                      gross,
                      tare,
                      zero,
                      vvalue,
                      glcount
                      );
       
   // отобразить результаты
   Memo1->Lines->Add("Packet: " + IntToStr(glcount));

   Memo1->Lines->Add("Mode work: " + AnsiString((char *)mode));
   Memo1->Lines->Add("Weight brutto/netto: " + AnsiString((char *)weight));
   Memo1->Lines->Add("Weight unit: " + AnsiString((char *)weightu));

   Memo1->Lines->Add("Value: " + FloatToStr(vvalue));
  }

}
//---------------------------------------------------------------------------




ПОРЯДОК ИСПОЛЬЗОВАНИЯ и ОГРАНИЧЕНИЯ
  1. Вы можете произвольно задавать COM порт в процедуре 'reinit()' с постоянно поднятым флагом активации, в библиотеке это обрабатывается.
  2. Параметр gl_count процедуры 'getdata' отображает количество принятых пакетов данных из COM-порта.
  3. Осуществляется автоотслеживание выдергивания конвертора RS-485/USB (через SetupAPI) и переподключение на заданный при инициализации порт.
  4. Параметр 'log' функции 'reinit()' задает разрешение на ведение лога декодированных посылок с временными метками.
  5. Теперь при активации подключения к порту, виртуальному или физическому автоматически создается новый отчет измерений 'дата время.txt' в следующем формате:
 Дата и время старта
 [время запроса] [Mode work] [Brutto/Netto] [Number Device] [STABLE] [HIGH] [LOW] [HOLD] [GROSS] [TARE] [ZERO] [weight value] [Unit]
Пример реальных данных:
 START: 17.09.14 21:48:45.984
 21:49:37.187 stable netto 1 0 1 1 0 0 0 1 2130.5 KG
 21:49:38.132 stable netto 1 0 1 1 0 0 0 1 2110.0 KG
 21:49:39.564 stable netto 1 0 1 1 0 0 0 1 2120.1 KG
 ...

Комментариев нет:

Отправить комментарий

В комментариях уважайте собеседника, внимательно читайте посты и не додумывайте. Просьбы и предложения из разряда: «можно ваш Skype/Viber/телефон», «напишите мне в vk/FB», а также другие им подобные — игнорируются. Выход новых версий ПО, внешняя ссылка, переставшая работать с течением времени и т.п. не является основанием для претензий. Желающие спокойно подискутировать и высказаться — Welcome. Желающие спонсировать блог — Donate. Нарушение этих простых правил ведет к бану и удалению комментариев без предупреждения.