欢迎您使用《iSmart电子秤接口程序》
请先指定一个临时目录进行解压，然后将解压出来的文件AutoInit_XXXX.ba_的扩展名改为AutoInit_XXX.bat，并执行
它即可完全本接口程序的初期化安装工作。

-------附文件功能说明----------------------------
必备文件
pos_ad_dll.dll------------第三方开发接口


PrintOnce.exe-------------USB接口收据打印程序，MT内部调用
printer_driver.dll--------USB打印机收据打印驱动，MT内部调用

LPTPrintOnce.exe----------并口接口打印程序，MT内部调用
lptprinter_driver.dll-----并口打印机打印驱动，MT内部调用

IDNET_Service.exe---------秤重数据处理后台服务，MT内部调用

VcoScale.dll--------------MT内部调用,此文件版本号固定为2.0
OpenCashBox.exe-----------钱箱控制程序，MT内部调用


显示相关
以下两个文件如果在无USB客显屏(320*240)时无须使用，
如果需要显示称重条 或 有USB显示客显屏则必须使用。
当需要显示稳重示数条时，请将调用一下
SmartDisplay.exe----------主屏显示称重示数窗口
RefreshScreen.exe---------客显屏刷新显示程序
display_driver.dll----------客显屏驱动

测试程序
VCO_Interface_test.exe----测试程序，仅供开发调试阶段测试使用
-------------------------------------------------


pos_ad_dll.dll接口函数调用说明
#define HS_OK    0xF0
#define HS_ERROR 0xFF
HS_OK表示操作返回成功
HS_ERROR表示操作返回失败

备注：
所有接口函数均有一个以_stdcall结尾的副本，如初始化打印机接口
的函数有int OpenPrinter(void)和int OpenPrinter_stdcall(void)，
后者主要是解决三方使用PowerBuilder作为开发工具时对有参数的接
口调用异常。因此对于三方使用PowerBuilder作为开发工具时，请
调用后缀为_stdcall的接口函数。


//**********************打印相关*************************
//初始化打印机，现为空接口，仅为兼容旧版本而存在，无实际意义
int OpenPrinter(void)

//关闭打印机，现为空接口，仅为兼容旧版本而存在，无实际意义
int ClosePrinterEx(void)

//格式化待打印字符串
int PrintText(char *str,int FontSize)---只适合打印60mm宽的纸张
int PrintTextByPaperWidth(char *str,int FontSize,int PaperWidth)---可适合打印30-80mm宽的纸张
参数：
str长度必须小于20480
FontSize必须介于12-72之间,相应字号的高度等于字号除以8，单位为毫米，如72号字为9mm高。
PaperWidth纸张宽度必须介于30-80mm之间
返回值：
HS_OK
HS_ERROR

//设置发票头部保留的空行点数，打印数据的点数
int SetInvoiceParameter(int HeaderReserveRows,int DataRows)
参数：
HeaderReserveRows,int DataRows
HeaderReserveRows：//数据开始打印前需要预留的行(点)数(20~480)，默认值是256
DataRows：打印数据行数(20~2000)，默认为860行(点)数(末尾另外会根据需要自动添加一个24号字的“          <---续下页--->”)
返回值：
HS_OK
HS_ERROR


//设置打印机打印方向
DllExport int  SetUSBPrinterDirection(int Direction)
参数：Direction
      1：正向
      0：反向
返回值：
HS_OK
HS_ERROR

//设置打印机收纸马达方向
DllExport int  SetTakeupMotorDirection(int Direction)
参数：Direction
      1：正向
      0：反向
返回值：
HS_OK
HS_ERROR

//设置打印头宽度
DllExport int  SetRealPrintHeaderWidth(int Width)
参数：Width：54、56、72、80,单位毫米
返回值：
HS_OK
HS_ERROR

//设置发票打印内容前保留的点数（空白）
int  SetHeaderReserveRows(int ReserveRows)
参数：ReserveRows<=640，单位点
     除以8为毫米数
返回值：
HS_OK
HS_ERROR

//设置发票打印内容的最大行数
int  SetDataRows(int DataRows)
参数：DataRows <=860，单位点
     除以8为毫米数
返回值：
HS_OK
HS_ERROR

//设置打印浓度8最浓
int  SetPrintContrast(int Contrast)
参数：Contrast： 0--8
     0表示最淡，8表示最浓
返回值：
HS_OK
HS_ERROR

//设置打印速度
int  SetPrintSpeed(int Speed)
参数：Speed
      0：125mm/s
      1：100mm/s
      2：90mm/s
      3：80mm/s
      4：70mm/s
      5：60mm/s
返回值：
HS_OK
HS_ERROR


//设置打印后多走的方便取纸的偏移0-240
int  SetPrintOffset(int Offset)
参数：Offset:0-240
      实测iSmart秤设置Offset=104；uc-more秤设置Offset=56时效果最佳
返回值：
HS_OK
HS_ERROR

//设置秤类型
int  SetScaleType(int ScaleType)
参数：ScaleType
      1:iSmartP
      2:iSmartS
      3:iSmartEvo 或 UC-HTT-M
      4:iSmartEvo_Label
      5:保留
      6:UC-HTT-V
      Other:默认作为 iSmartP
DllExport int  SetScaleType(int ScaleType)
返回值：
HS_OK
HS_ERROR


//设置收据、发票模式下的默认纸宽（仅对使用函数PrintText有效）
int  SetDefaultPaperWidth(int DefaultPaperWidth)
参数：DefaultPaperWidth默认纸宽范围30-80mm
返回值：
HS_OK
HS_ERROR

//设置取纸传感器是否有效,Enable=1启用，0禁用（仅标签模式有效）
int SetTakeLabelSensor(int Enable);
参数：Enable 默认为启用
返回值：
HS_OK
HS_ERROR


//设置标签需要打印的内容（LabelAngle=0，不旋转，其它值旋转180度）
int PrintLabelImage(char *ImageData,int ImageDataBytes,int LabelPaperWidth,int LabelAngle)
参数：
ImageData:格式化好的点阵数据
ImageDataBytes:点阵数据字节数允许范围11520-172800，最小高度160点，最大高度2400点,(最宽72mm宽)
LabelPaperWidth:标签纸宽,30-72mm宽
LabelAngle=0:不旋转，其它值旋转180度
返回值：
HS_OK
HS_ERROR

//位图文件打印
int PrintBitmapFile(char *BmpFileName,int LabelAngle)
参数：
BmpFileName：位图图片文件(支持24位色以下位图)
LabelAngle=0:不旋转，其它值旋转180度
返回值：
HS_OK
HS_ERROR

//开始打印
int BeginPrint(int PrintType)
参数：
PrintType
    0：iSmartP/iSmartS/UC-HTT-M调用PrintOnce.exe打印收据
    1：iSmartP/iSmartS/UC-HTT-M调用InvoicePrintOnce.exe打印圈式发票（内容根据头部空白行（点）数、最多打印数据行（点）数两个参数自动分页）
    2：iSmartP/iSmartS/UC-HTT-M调用LabelPrintOnce.exe打印标签，Print.tmp为点阵数据
    3：UC-HTT-V调用LPTPrintOnce.exe打印收据
    4：走纸
    5：打印测试标签
    6：取打印机程序版本信息--版本信息在注册表中\\SOFTWARE\\MT_RTBU，PrinterProgramNum、PrinterProgramVer
    7：以收据模式打印点阵数据(pc_bPro)

    80,81,82,83,90,91,92,93：测纸(标定纸距传感器)
        测标签: 80、90
        测收据：81、91
        测无基纸的连续标签：82、92
        测黑标的发票：83、93
        80--83 正常测纸
        90--93 在测纸前会重启USB打印机
返回值：
HS_OK
HS_ERROR

打印补充说明：
PrintText,PrintTextByPaperWidth均支持连续多次调用，最后调用开始打印BeginPrint函数。
也可以将多行文本内容一次性传入，再调用开始打印BeginPrint函数。
PrintText,PrintTextByPaperWidth无论是一次性调用还是多次连续调用，传入的字符串总长度之和必须小于40960。


//**********************称重相关*************************
//读取量程信息----在访问称重相关接口函数之前，必须至少调用一次此函数，并将取得的相关量程信息如实的显示到应用程序界面上。
int read_baseinfo(char *buf)
buf长度要大于等于65字节
返回值：
HS_OK
HS_ERROR
如返回HS_OK,则成功取得量程信息,数据结构如下
    long max_range[3];  //最大秤量
    long min_range;     //最小秤量
    long max_tare;      //最大皮重
    long max_pre_tare;  //最大预置皮重
    long resolution[3]; //分度
    char Weight_unit[4];//重量单位
    char money_unit[4]; //货币单位
    char system_version[20];//数传版本

//清零
int send_zero(void)
返回值：
HS_OK成功
1    非稳定状态且处于非欠载状态禁止清零
2    负载超出去皮范围
3    过载超出去皮范围
-1   异常
-2   数传通讯异常
-3   数传内：语法、逻辑/无法执行、内部函数错误
-8   与IDNET_Service连接失败
-9   与IDNET_Service数据通讯错误

//设置皮重,为了兼容旧的接口而保留
int send_tare(char *buf)
参数：
buf的长度必须大于等于10字节。
buf中的值为空字符串或"0"或"0.000"，有两种函义：
	1，如果有皮重，如毛重=0，则清除皮重，否则如净重大于0，则按键去皮
	2，如果没有皮重，则按键去皮
buf为皮重字符串则表示预置去皮,如:需要设置的皮重值的字符串,如20克，则参数为字符串"0.020"。
返回值：
HS_OK成功,此时buf中存放当前皮重
1    不合法规禁止操作
2    欠载
3    过载超出去皮范围
4    参数异常
5    数据处理异常
-1   IDNET_Service与串口通讯异常
-2   IDNET_Service与数传通讯异常
-3   IDNET_Service与数传语法、逻辑/无法执行、内部函数错误
-8   与IDNET_Service连接失败
-9   与IDNET_Service数据通讯错误
当返回HS_OK时，表明当前次皮重操作成功，操作后实际的皮重值会存放在buf中，如皮重操作后皮重值为20克，则buf中的内容为"00.0200"。

//设置预置皮重，根据传入的皮重参数进行去皮
//参数buf既作为传入参数，又作为返回皮重使用，长度要大于等于10字节
int send_pre_tare(char *buf)
参数：
需要设置的皮重值的字符串,如20克，则参数为字符串"0.020"。
如果参数为空字符串或等于"0.000"，则功能等价于清除皮重。
返回值：
HS_OK成功,此时buf中存放当前皮重
1    不合法规禁止操作
2    欠载
3    过载超出去皮范围
4    参数异常
5    数据处理异常
-1   IDNET_Service与串口通讯异常
-2   IDNET_Service与数传通讯异常
-3   IDNET_Service与数传语法、逻辑/无法执行、内部函数错误
-8   与IDNET_Service连接失败
-9   与IDNET_Service数据通讯错误


//按键去皮，根据秤盘上当前重量进行自动去皮
//参数buf供返回皮重使用，长度要大于等于10字节
int set_tare_bykey(char *buf)
返回值：
HS_OK成功,此时buf中存放当前皮重
1    不合法规禁止操作
2    欠载
3    过载超出去皮范围
5    数据处理异常
-1   IDNET_Service与串口通讯异常
-2   IDNET_Service与数传通讯异常
-3   IDNET_Service与数传语法、逻辑/无法执行、内部函数错误
-8   与IDNET_Service连接失败
-9   与IDNET_Service数据通讯错误

//清除皮重
//参数buf供返回皮重使用，长度要大于等于10字节
int clear_tare(char *buf)
返回值：
HS_OK成功,此时buf中存放当前皮重
1    不合法规禁止操作
2    欠载
3    过载超出去皮范围
5    数据处理异常
-1   IDNET_Service与串口通讯异常
-2   IDNET_Service与数传通讯异常
-3   IDNET_Service与数传语法、逻辑/无法执行、内部函数错误
-8   与IDNET_Service连接失败
-9   与IDNET_Service数据通讯错误


//读取重量
int read_standard(char *buf)
buf长度要大于等于18字节
返回值：
HS_OK    成功
-1       欠载
-2       过载
HS_ERROR 异常
如返回HS_OK,则成功取得重量信息,数据结构如下
    char status;     
	//status的bit0(第一位)表示是否稳定，如为1则表示稳定
	//status的bit1(第二位)表示是否在零位，如为1则表示零位
	//status的bit2(第三位)表示是否有皮重，如为1则表示有皮重
    char net_weight[7];
    char FixSeparator;//固定为"P"
    char tare_weight[7];
    
    当处于欠载状态时，net_weight中的数据为"┏━┓ "，返回值为-1
    当处于过载状态时，net_weight中的数据为"┗━┛ "，返回值为-2

示例：如稳定的净重量为1234g，皮重10g，则返回数据如下
status的值为5
net_weight 中的数据为："01.2340"
FixSeparator的值为字符:'P'
tare_weight中的数据为："00.0100"

C#、Delphi取重量的示例参考本文档最后一部分内容，对于个别开发语言不支持位操作时，可以用下面的方法来判断稳定&零位&皮重标志：
bit2~~bit0   对应十进制数   皮重状态  零位状态  稳定状态
000               0          无皮重    非零位    非稳定
001               1          无皮重    非零位     稳定
010               2          无皮重     零位     非稳定
011               3          无皮重     零位      稳定
100               4          有皮重    非零位    非稳定
101               5          有皮重    非零位     稳定
110               6          有皮重     零位     非稳定
111               7          有皮重     零位      稳定
将status转为十进制数，然后判断对应的十进制值，以确定状态。


;开钱箱
int OpenCashDrawerEx(void)

*****************************************************************
在iSmartS以外的秤上，如不使用称重条时，请不要调用ShowOrHideForm、ShowProduct、ShowDisplayText、ShowBalance 等四个函数。
如果需要使用顶部称重条，在调用这几个函数前，需自己运行SmartDispaly.exe程序，否则调用无效，且会在约1s左右才会返回。
//******************主屏称重条显示相关*************************
int ShowOrHideForm(int State)
参数:
State=1，显示主窗体
State=0，隐藏主窗体
返回值：
HS_OK
HS_ERROR

//******************客显屏显示相关******************************
//显示商品
int ShowProduct(char* plu_name,int unit_price,int price_type,int count,char * unit,int roundtype)
参数:
plu_name:品名，长度必须小于30
unit_price:必须介于0-999999之间(单位:分)
price_type:0表示计重，1表示计数
count:计数商品的数量,计重时传0,计数量1-1000
unit:计数商品的单位,计重商品传空符串（""）
roundtype:总价圆整方式（0=不圆整；1=抹去1位小数；2=抹去2位小数；3=四舍五入）

返回值：
HS_OK
HS_ERROR

//显示纯文本
int ShowDisplayText(int x_pos,int y_pos,int font_size,char* Text)
参数:
x_pos:横坐标，必须介于0-320之间
y_pos:纵坐标，必须介于0-240之间
font_size:字号，必须介于12-72之间
Text:显示内容，长度必须小于200字节

返回值：
HS_OK
HS_ERROR

//显示结算信息
int ShowBalance(int total_price,int charge,int change)
参数:
total_price:总价,必须介于0-999999之间(单位:分)
charge:收款,必须介于0-999999之间(单位:分)
change:找零,必须介于0-999999之间(单位:分)

返回值：
HS_OK
HS_ERROR


附C#读取重量示例
       [DllImport("pos_ad_dll.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
       public static extern int read_standard_stdcall(byte[] str);

        private void timer1_Tick(object sender, EventArgs e)
        {
            timer1.Enabled = false;
            int li_ret = 0;
            byte[] p = new byte[32];
            string s = "";
            try
            {
                li_ret = read_standard_stdcall(p);
                /*
                 * HS_OK    成功
                 * -1       欠载
                 * -2       过载
                */
                switch (li_ret)
                {
                    case -1:
                        {
                            s = "欠载";
                            break;
                        }
                    case -2:
                        {
                            s = "过载";
                            break;
                        }
                    case 0xF0:
                        {
                            s = "成功-----";
                            //status的bit0(第一位)表示是否稳定，如为1则表示稳定
                            //status的bit1(第二位)表示是否在零位，如为1则表示零位
                            //status的bit2(第三位)表示是否有皮重，如为1则表示有皮重  
                            byte status = p[0];
                            if ((status & 0x01) == 0x01)
                            {
                                s = s + "稳定";
                            }
                            else
                            {
                                s = s + "动态";
                            }
                            if ((status & 0x02) == 0x02)
                            {
                                s = s + "零位";
                            }
                            else
                            {
                                s = s + "非零位";
                            }
                            if ((status & 0x04) == 0x04)
                            {
                                s = s + "有皮重";
                            }
                            else
                            {
                                s = s + "无皮重";
                            }
                            s = s + Encoding.Default.GetString(p, 1, p.Length - 1);
                            break;
                        }
                    default:
                        {
                            s = "失败";
                            break;
                        }
                }
            }
            catch (Exception ex)
            {
                s = "异常" + ex.Message.ToString();

            }
            listBox1.Items.Insert(0, s);
            timer1.Enabled = checkBox1.Checked;
         }

        private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            timer1.Enabled = checkBox1.Checked;
        }

附二：Delphi取重量示例
function read_standard(str:Pchar):integer;cdecl;external 'pos_ad_dll.dll';
const HS_OK=$f0;
const HS_ERROR=$ff;
//重量
type TGetWeight = packed record //加上packed，单字节对齐
  status:char;
//	bit0:表示第一位稳定状态位，如为1则稳定，否则非稳定；
//	bit1:表示第二位零位状态位，如为1则零位，否则非零位；
//	bit2:表示第三位去皮状态位，如为1则有皮重，否则无皮重；
  weight:array[1..7]of char;
  fixchar :char;//fixed,it is "P"
  tare:array[1..7]of char;
  dummy:char; //0x00
end;

procedure TForm1.Button1Click(Sender: TObject);
var
   Ret :integer;
   weight : TGetWeight;
   status:integer;
   s: string;
begin
//取重量
   ZeroMemory(@weight,   SizeOf(weight));
   Ret :=  read_standard(@weight);//获取重量、皮重
   if(Ret=HS_OK)then
   begin
      status := ord(weight.status);
     //bit0:第一位表示稳定状态，如为1则稳定，否则不稳；
      if((status and $1)=$1)then
      begin
         s := '稳定';
      end
      else
      begin
         s := '不稳定';
      end;
     //bit1:第二位表示零位状态，如为1则零位，否则非零位；
      if((status and $2)=$2)then
      begin
         s := s+ '零位';
      end
      else
      begin
         s := s+ '非零位';
      end;
     //bit2:第三位表示皮重状态，如为1则有皮重，否则无；
      if((status and $4)=$4)then
      begin
         s := s+ '净重';
      end
      else
      begin
         s := s+ '总重';
      end;

      s1 := '               ';
      s2 := s1;
      CopyMemory(@s1[2],@weight.weight,7);
      CopyMemory(@s2[2],@weight.tare,7);
      s1 := Trim(s1);
      s2 := Trim(s2);
      s := s+ Format('  重量%s,皮重%s',[s1,s2]);
   end
   else if(Ret=-1)then
   begin
        //欠载状态
   end
   else if(Ret=-2)then
   begin
        //过载状态
   end
   else
   begin
        //取重量失败
   end;
end;

示例三 VB6取重量
Option Explicit

Private Declare Function read_standard_stdcall Lib "pos_ad_dll.dll" (wt As Any) As Integer
Private Declare Function read_baseinfo_stdcall Lib "pos_ad_dll.dll" (info As Any) As Integer

Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)

Public Function GetWeightInfo() As String
   Dim buf(32) As Byte

    Dim Ret As Integer
    Dim s As String
    Dim status As Integer
    Dim i As Integer
    
    For i = 1 To 10
        
        Ret = read_standard_stdcall(buf(0))
        If (Ret = 240) Then
            status = buf(0)
            buf(0) = &H30
            s = StrConv(buf, vbUnicode)
            GetWeightInfo = s
        
            Exit Function
        Else
           If (Ret = -1) Then
               GetWeightInfo = "欠载"
               Exit Function
           End If
           If (Ret = -2) Then
               GetWeightInfo = "过载"
               Exit Function
           End If
        
           
           Sleep (100)
           
        End If
    Next i
    
    GetWeightInfo = "Error"
End Function
