%@MACRO
//初始化
     WAIT();
     #161:=PARAM(161);
     #46:=PARAM(41);
     #121:=PARAM(121);
     #122:=PARAM(122);
     #40:=#161*#122/#121;
     #30:=#161*#122/#121;

     #162:=PARAM(162);
     #66:=PARAM(42);
     #123:=PARAM(123);
     #124:=PARAM(124);
     #60:=#162*#124/#123;
     #50:=#162*#124/#123;

     #163:=PARAM(163);
     #86:=PARAM(43);
     #125:=PARAM(125);
     #126:=PARAM(126);
     #80:=#163*#126/#125;
     #70:=#163*#126/#125;

     #164:=PARAM(164);
     #106:=PARAM(44);
     #127:=PARAM(127);
     #128:=PARAM(128);
     #100:=#164*#128/#127;
     #90:=#164*#128/#127;


IF @483=1  THEN    //手动设置机械0点
   CASE  @466 OF
   //设置机械0点***************************
   1:
     WAIT();
     IF @106001=1 THEN
        #31:=@106000+65536;
     ELSE
        #31:=@106000;
     END_IF;
     #32:=@106002;          //圈数
     WAIT();
     //#33:=ROUND(#31*#30/131072.);   // 计算出单圈的实际坐标    
	 #35:=(#31/131072.);
	 #36:=ROUND(#35*#30);
     IF #32>30000. THEN       //如果圈数大于30000则认为是负的；65533  65534  65535  0   1   2
        #34:=#32-65536.;      
     ELSE
        #34:=#32;
     END_IF;
     WAIT();
     @106090:=#34*#30+#36;   //计算出实际设置0点时的坐标值
     @107000:=0;
     WAIT();
     G90 G10 L1000 P260 R1;

   //设置Y机械0点***********************
   2:
     WAIT();

     IF @106011=1 THEN
        #51:=@106010+65536;
     ELSE
        #51:=@106010;
     END_IF;
     #52:=@106012 ;          //圈数
     WAIT();
     //#53:=(#51*#50/131072.);   // 计算出单圈的实际坐标   数值太大，存在问题；
	 #55:=#51/131072.;
	 #56:=ROUND(#55*#50);
	 
     @106014:=(#56);
	 IF #52>30000. THEN       //如果圈数大于30000则认为是负的；65533  65534  65535  0   1   2
        #54:=#52-65536.;      
     ELSE
        #54:=#52;
     END_IF;
     WAIT();
	 @106015:=#54*#50;
     @106091:=#54*#50+#56;   //计算出实际设置0点时的坐标值
     @107002:=0;
     WAIT();
     G90 G10 L1000 P262 R1;
  //设置Z机械0点***********************
   3:
     WAIT();

     IF @106021=1 THEN
        #71:=@106020+65536;
     ELSE
     #71:=@106020;
     END_IF;
     #72:=@106022;          //圈数
     WAIT();
     //#73:=ROUND(#71*#70/131072.);   // 计算出单圈的实际坐标    
     #75:=(#71/131072.);
	 #76:=ROUND(#75*#70);
	 IF #72>30000. THEN       //如果圈数大于30000则认为是负的；65533  65534  65535  0   1   2
        #74:=#72-65536.;      
     ELSE
        #74:=#72;
     END_IF;
     WAIT();
     @106092:=#74*#70+#76;   //计算出实际设置0点时的坐标值
     @107004:=0;
     WAIT();
     G90 G10 L1000 P264 R1;
   4:
     WAIT();

     IF @106031=1 THEN
        #91:=@106030+65536;
     ELSE
     #91:=@106030;
     END_IF;
     #92:=@106032;          //圈数
     WAIT();
     //#93:=ROUND(#91*#90/131072.);   // 计算出单圈的实际坐标    
     #95:=(#91/131072.);
	 #96:=ROUND(#95*#90);
	 IF #92>30000. THEN       //如果圈数大于30000则认为是负的；65533  65534  65535  0   1   2
        #94:=#92-65536.;      
     ELSE
        #94:=#92;
     END_IF;
     WAIT();
     @106093:=#94*#90+96;   //计算出实际设置0点时的坐标值
     @107006:=0;
     WAIT();
     G90 G10 L1000 P266 R1;
   END_CASE;
ELSE 
  //开机自动读取绝对式坐标
 IF @483=2  THEN 
   CASE  @466 OF
   //开机读取X绝对式坐标
   1:
     WAIT();

     IF @106001=1 THEN          //编码器单圈内是否超过半圈
        #41:=@106000+65536;    //超过半圈的则当前值加上半圈值
     ELSE
        #41:=@106000;
     END_IF;
     #42:=@106002;          //圈数
     WAIT();
     //#43:=ROUND(#41*#40/131072.);   // 计算出单圈的实际坐标    
     #47:=(#41/131072.);
	 #48:=ROUND(#47*#40);
	 @106081:=#43;
     IF #42>30000. THEN       //如果圈数大于30000则认为是负的；65533  65534  65535  0   1   2
        #44:=#42-65536.;      
     ELSE
        #44:=#42;
     END_IF;
     WAIT();
     #45:=#44*#40+#48-@106090;   //计算出实际的坐标值
     IF #46=0 THEN
       @107001:=(-1)*#45*@100801;
     ELSE
       @107001:=(1)*#45*@100801;
     END_IF;
     WAIT();
     G90 G10 L1000 P261 R1;
   //开机读取Y绝对式坐标
   2:
     WAIT();

     IF @106011=1 THEN          //编码器单圈内是否超过半圈
        #61:=@106010+65536;    //超过半圈的则当前值加上半圈值
     ELSE
        #61:=@106010;
     END_IF;
     #62:=@106012;          //圈数
     WAIT();
     //#63:=ROUND(#61*#60/131072.);   // 计算出单圈的实际坐标    
     #67:=(#61/131072.);
	 #68:=ROUND(#67*#60);
	 @106082:=#63;
     IF #62>30000. THEN       //如果圈数大于30000则认为是负的；65533  65534  65535  0   1   2
        #64:=#62-65536.;      
     ELSE
        #64:=#62;
     END_IF;
     WAIT();
     #65:=#64*#60+#68-@106091;   //计算出实际的坐标值
     IF #66=0 THEN
        @107003:=#65*@100802;
     ELSE
        @107003:=(-1)*#65*@100802;
     END_IF;
     WAIT();
     G90 G10 L1000 P263 R1;
   //开机读取Z绝对式坐标
   3:
     WAIT();

     IF @106021=1 THEN          //编码器单圈内是否超过半圈
        #81:=@106020+65536;    //超过半圈的则当前值加上半圈值
     ELSE
        #81:=@106020;
     END_IF;
     #82:=@106022;          //圈数
     WAIT();
     //#83:=ROUND(#81*#80/131072.);   // 计算出单圈的实际坐标    
    #87:=(#81/131072.);
	#88:=ROUND(#87*#80);
	@106083:=#83;
     IF #82>30000. THEN       //如果圈数大于30000则认为是负的；65533  65534  65535  0   1   2
        #84:=#82-65536.;      
     ELSE
        #84:=#82;
     END_IF;
     WAIT();
     #85:=#84*#80+#88-@106092;   //计算出实际的坐标值
     IF #86=0 THEN
       @107005:=#85*@100803;
     ELSE
       @107005:=(-1)*#85*@100803;  
     END_IF;
     WAIT();
     G90 G10 L1000 P265 R1;
   4:
     WAIT();

     IF @106031=1 THEN          //编码器单圈内是否超过半圈
        #101:=@106030+65536;    //超过半圈的则当前值加上半圈值
     ELSE
        #101:=@106030;
     END_IF;
     #102:=@106032;          //圈数
     WAIT();
     //#103:=ROUND(#101*#100/131072.);   // 计算出单圈的实际坐标    
    #107:=(#101/131072.);
	#108:=ROUND(#107*#100);
	@106084:=#103;
     IF #102>30000. THEN       //如果圈数大于30000则认为是负的；65533  65534  65535  0   1   2
        #104:=#102-65536.;      
     ELSE
        #104:=#102;
     END_IF;
     WAIT();
     #105:=#104*#100+#108-@106093;   //计算出实际的坐标值
     IF #106=0 THEN
       @107007:=#105*@100804;
     ELSE
       @107007:=(-1)*#105*@100804;  
     END_IF;
     WAIT();
     G90 G10 L1000 P267 R1;
   END_CASE;
  END_IF;
END_IF;
M30;