/////////////////////////////////////////////////////////////////// // 不具合回避サンプル // 日本パルスモーター株式会社 // 2012.12.27 /////////////////////////////////////////////////////////////////// int RegCommandCheck(char RCom, unsigned long WriteD, char AxisSel); int CommandCheck(char RCom, unsigned long WriteD, char AxisSel, unsigned long RplsX, unsigned long RplsY, unsigned long RplsZ, unsigned long RplsU, unsigned long Rltc1X, unsigned long Rltc2X, unsigned long Rltc1Y, unsigned long Rltc2Y, unsigned long Rltc1Z, unsigned long Rltc2Z, unsigned long Rltc1U, unsigned long Rltc2U); int PortCommandCheck(char RCom, unsigned long WriteD, char AxisSel); char SelectAxis(char AxisSel); int BitChecker(unsigned long RegD, unsigned long mask, unsigned long val); int RegChecker(unsigned long RegD, unsigned long val); int SpeedChecker(unsigned long SetSpeed, unsigned long NowSpeed); void SelRltc(char AxisSel, unsigned long Rltc1X, unsigned long Rltc2X, unsigned long Rltc1Y, unsigned long Rltc2Y, unsigned long Rltc1Z, unsigned long Rltc2Z, unsigned long Rltc1U, unsigned long Rltc2U, unsigned long *WorkRltc1, unsigned long *WorkRltc2); unsigned long SetRegMask(char RCom); void SelRpls(char AxisSel, unsigned long RplsX, unsigned long RplsY, unsigned long RplsZ, unsigned long RplsU, unsigned long *WorkRpls); int StopChek(char WorkSelR, char WorkSelM, char WorkSelS, unsigned long rcun1); int PcsChek(char WorkSelR, unsigned long rpls, unsigned long rcun1); /////////////////////////////////////////////////////////////////// // コマンドの実行確認 // // 引数:RCom :書込み処理で使用したコマンド // WriteD :レジスタ書込みコマンドの場合の書込みデータ // AxisSel :レジスタ書込みコマンド使用時の軸選択コマンド // RplsX :X軸の位置きめカウンタ // RplsY :X軸の位置きめカウンタ 制御対象が「PCL6114」の場合はゼロを指定 // RplsZ :X軸の位置きめカウンタ 制御対象が「PCL6114」、「PCL6124」の場合はゼロを指定 // RplsU :X軸の位置きめカウンタ 制御対象が「PCL6114」、「PCL6124」の場合はゼロを指定 // Rltc1X :X軸のラッチレジスタ1 // Rltc2X :X軸のラッチレジスタ2 // Rltc1Y :Y軸のラッチレジスタ1 制御対象が「PCL6114」の場合はゼロを指定 // Rltc2Y :Y軸のラッチレジスタ2 制御対象が「PCL6114」の場合はゼロを指定 // Rltc1Z :Z軸のラッチレジスタ1 制御対象が「PCL6114」、「PCL6124」の場合はゼロを指定 // Rltc2Z :Z軸のラッチレジスタ2 制御対象が「PCL6114」、「PCL6124」の場合はゼロを指定 // Rltc1U :U軸のラッチレジスタ1 制御対象が「PCL6114」、「PCL6124」の場合はゼロを指定 // Rltc2U :U軸のラッチレジスタ2 制御対象が「PCL6114」、「PCL6124」の場合はゼロを指定 // 戻り:0=処理成功、 1=処理失敗 // int CheckCommandExecute(char RCom, unsigned long WriteD, char AxisSel, unsigned long RplsX, unsigned long RplsY, unsigned long RplsZ, unsigned long RplsU, unsigned long Rltc1X, unsigned long Rltc2X, unsigned long Rltc1Y, unsigned long Rltc2Y, unsigned long Rltc1Z, unsigned long Rltc2Z, unsigned long Rltc1U, unsigned long Rltc2U) { int ComCnt = 1; int ret; while (ComCnt < 5) { if((AxisSel & (char)0x30) == (char)0x20) { //汎用ポートへの書込みコマンド ret = PortCommandCheck(RCom, WriteD, AxisSel); } else if((RCom & (char)0xC0) == (char)0x80) { //レジスタ書込みコマンドの実行確認 ret = RegCommandCheck(RCom, WriteD, AxisSel); } else if((RCom & (char)0x80) == (char)0x00) { //動作・制御系コマンドの実行確認 ret = CommandCheck(RCom, WriteD, AxisSel, RplsX, RplsY, RplsZ, RplsU, Rltc1X, Rltc2X, Rltc1Y, Rltc2Y, Rltc1Z, Rltc2Z, Rltc1U, Rltc2U); } else { ret = 0; } if(ret == 1) { ComCnt++; if(ComCnt < 5) { //コマンド、汎用ポートへの書込み の再実行 //<<<<< 再実行処理を記述してください >>>>> } } else { break; } }//while (ComCnt > 5) return(ret); } /////////////////////////////////////////////////////////////////// // レジスタ書込みコマンドの実行確認 // // 引数:RCom :書込み処理で使用したコマンド // WriteD :レジスタ書込みコマンドの場合の書込みデータ // AxisSel :レジスタ書込みコマンド使用時の軸選択コマンド // 戻り:0=処理成功、 1=処理失敗 // int RegCommandCheck(char RCom, unsigned long WriteD, char AxisSel) { int ret = 0; char WorkSel; char WorkCom; unsigned long ReadReg; unsigned long RegMask; //書込みを実行したレジスタのリード WorkSel = SelectAxis(AxisSel); WorkCom = RCom + 0x40; //レジスタリードコマンド作成 //<<<<< AxisSel、RComにより、レジスタからデータを読み込んでください >>>>> // SPIからWorkSelを出力 // SPIからWorkComを出力 // SPIに4バイトのダミーを出力しながらレジスタデータを「ReadReg」に取込む // ========= if((RCom == (char)0xB2) || (RCom == (char)0xB3)) { if((ReadReg & WriteD) != 0) { ret = 1; } } else { RegMask = SetRegMask(RCom); if((ReadReg & RegMask) != (WriteD & RegMask)) { ret = 1; } } return(ret); } /////////////////////////////////////////////////////////////////// // 動作・制御系コマンドの実行確認 // // 引数:RCom :書込み処理で使用したコマンド // WriteD :レジスタ書込みコマンドの場合の書込みデータ // AxisSel :レジスタ書込みコマンド使用時の軸選択コマンド // RplsX :X軸の位置きめカウンタ // RplsY :X軸の位置きめカウンタ 制御対象が「PCL6114」の場合はゼロを指定 // RplsZ :X軸の位置きめカウンタ 制御対象が「PCL6114」、「PCL6124」の場合はゼロを指定 // RplsU :X軸の位置きめカウンタ 制御対象が「PCL6114」、「PCL6124」の場合はゼロを指定 // Rltc1X :X軸のラッチレジスタ1 // Rltc2X :X軸のラッチレジスタ2 // Rltc1Y :Y軸のラッチレジスタ1 制御対象が「PCL6114」の場合はゼロを指定 // Rltc2Y :Y軸のラッチレジスタ2 制御対象が「PCL6114」の場合はゼロを指定 // Rltc1Z :Z軸のラッチレジスタ1 制御対象が「PCL6114」、「PCL6124」の場合はゼロを指定 // Rltc2Z :Z軸のラッチレジスタ2 制御対象が「PCL6114」、「PCL6124」の場合はゼロを指定 // Rltc1U :U軸のラッチレジスタ1 制御対象が「PCL6114」、「PCL6124」の場合はゼロを指定 // Rltc2U :U軸のラッチレジスタ2 制御対象が「PCL6114」、「PCL6124」の場合はゼロを指定 // 戻り:0=処理成功、 1=処理失敗 // int CommandCheck(char RCom, unsigned long WriteD, char AxisSel, unsigned long RplsX, unsigned long RplsY, unsigned long RplsZ, unsigned long RplsU, unsigned long Rltc1X, unsigned long Rltc2X, unsigned long Rltc1Y, unsigned long Rltc2Y, unsigned long Rltc1Z, unsigned long Rltc2Z, unsigned long Rltc1U, unsigned long Rltc2U) { int ret = 0; char WorkSelR; char WorkSelM; char WorkSelS; unsigned long mstsw, sstsw; unsigned long rfl, rfh, rmd, renv1, rcun1, rcun2, rpls, rltc1, rltc2, rsts, rspd; unsigned long WorkRltc1, WorkRltc2; unsigned long WorkRpls; //処理で使用する確認用レジスタの読出し WorkSelR = SelectAxis(AxisSel); WorkSelM = (WorkSelR & 0xCF) | 0x10; WorkSelS = (WorkSelR & 0xCF) | 0x30; //<<<<< ステータス、サブステータス、各レジスタからデータを読み込んでください >>>>> // //ステータスリード // SPIからWorkSelMを出力 // SPIに1バイトのダミーを出力しながらデータを「mstsw」に取込み、上位3バイトはゼロとする。 // ======= // //サブステータスリード // SPIからWorkSelSを出力 // SPIに2バイトのダミーを出力しながらデータを「sstsw」に取込む、上位2バイトはゼロとする。 // ======= // //RFLリード // SPIからWorkSelRを出力 // SPIから"0xD1"を出力 // SPIに4バイトのダミーを出力しながらレジスタデータを「rfl」に取込む // ===== // //RFHリード // SPIからWorkSelRを出力 // SPIから"0xD2"を出力 // SPIに4バイトのダミーを出力しながらレジスタデータを「rfh」に取込む // ===== // //RMDリード // SPIからWorkSelRを出力 // SPIから"0xD7"を出力 // SPIに4バイトのダミーを出力しながらレジスタデータを「rmd」に取込む // ===== // //RENV1リード // SPIからWorkSelRを出力 // SPIから"0xDC"を出力 // SPIに4バイトのダミーを出力しながらレジスタデータを「renv1」に取込む // ====== // //RCUN1リード // SPIからWorkSelRを出力 // SPIから"0xE3"を出力 // SPIに4バイトのダミーを出力しながらレジスタデータを「rcun1」に取込む // ====== // //RCUN2リード // SPIからWorkSelRを出力 // SPIから"0xE4"を出力 // SPIに4バイトのダミーを出力しながらレジスタデータを「rcun2」に取込む // ====== // //RPLSリード // SPIからWorkSelRを出力 // SPIから"0xF4"を出力 // SPIに4バイトのダミーを出力しながらレジスタデータを「rpls」に取込む // ====== // //RLTC1リード // SPIからWorkSelRを出力 // SPIから"0xED"を出力 // SPIに4バイトのダミーを出力しながらレジスタデータを「rltc1」に取込む // ====== // //RLTC2リード // SPIからWorkSelRを出力 // SPIから"0xEE"を出力 // SPIに4バイトのダミーを出力しながらレジスタデータを「rltc2」に取込む // ====== // //RSTSリード // SPIからWorkSelRを出力 // SPIから"0xF1"を出力 // SPIに4バイトのダミーを出力しながらレジスタデータを「rsts」に取込む // ====== // //RSPDリード // SPIからWorkSelRを出力 // SPIから"0xF5"を出力 // SPIに4バイトのダミーを出力しながらレジスタデータを「rspd」に取込む // ====== switch(RCom) { case 0x05://非常停止 ret = BitChecker(mstsw, 0x00000001, 0); break; case 0x40://FL定速瞬時変更 ret = SpeedChecker(rfl, rspd);//RFL break; case 0x41://FH定速瞬時変更 ret = SpeedChecker(rfh, rspd);//RFH break; case 0x42://FLまで減速 //減速しきった または 変速中であれば 成功、それ以外で失敗と判断 if (!( ((SpeedChecker(rfl, rspd)) == 0) || //減速しきった(減速中は見落とした) ((BitChecker(sstsw, 0x00000200, 1)) == 0) )) //減速中 { ret = 1;} break; case 0x43://FHまで加速 //加速しきった または 加速中であれば 成功、それ以外で失敗と判断 if (!( ((SpeedChecker(rfh, rspd)) == 0) || //加速しきった(加速中は見落とした) ((BitChecker(sstsw, 0x00000100, 1)) == 0) )) //加速中 { ret = 1;} break; case 0x49://即停止 case 0x4A://減速停止 ret = StopChek(WorkSelR, WorkSelM, WorkSelS, rcun1); break; case 0x50://FL定速スタート case 0x51://FH定速スタート case 0x52://高速スタート1 case 0x53://高速スタート2 case 0x54://残量FL定速スタート case 0x55://残量FH定速スタート case 0x56://残量高速スタート1 case 0x57://残量高速スタート2 ret = BitChecker(mstsw, 0x00000001, 1); break; case 0x20://COUNTER1 リセット ret = RegChecker(rcun1, 0); break; case 0x21://COUNTER2 リセット ret = RegChecker(rcun2, 0); break; case 0x2D://MSTSW.SENI リセット ret = BitChecker(mstsw, 0x00000004, 0); //MSTSW.bit2(SENI)=1 break; case 0x2E://MSTSW.SEOR リセット ret = BitChecker(mstsw, 0x00002000, 0); //MSTSW.bit13(SEOR)=1 break; case 0x06://CSTA出力/同時スタート case 0x2A://自軸のみCSTA入力 //RMD(19:18)="01" かつ 動作中 かつ パルス出力なしで失敗と判断 if ( ((BitChecker(rmd, 0x00040000, 1)) == 0) && //RMD.bit18=1 ((BitChecker(rmd, 0x00080000, 0)) == 0) && //RMD.bit19=0 (01) ((BitChecker(mstsw, 0x00000001, 1)) == 0) && //MSTS.bit0=1 スタートしている ((BitChecker(mstsw, 0x00000002, 0)) == 0) ) //MSTS.bit1=1 パルス出力なし { ret = 1;} break; case 0x07://CSTP出力 //RMD.bit24=1 かつ 動作している場合に失敗と判断(動作していても減速していれば成功) if ((BitChecker(rmd, 0x01000000, 1)) == 0) //RMD.bit24=1 //CSTP入力で停止モード { ret = StopChek(WorkSelR, WorkSelM, WorkSelS, rcun1); } break; case 0x26://プリレジキャンセル ret = BitChecker(mstsw, 0x00004000, 0);//MSTS.bit14=0 break; case 0x28://PCS代行 if ( ((BitChecker(rmd, 0x00004000, 1)) == 0) && //RMD.bit14=1 //PCS入力から位置きめを管理するモード ((BitChecker(mstsw, 0x00000002, 1)) == 0) ) //MSTS.bit1=1 パルス出力中 { SelRpls(AxisSel, RplsX, RplsY, RplsZ, RplsU, &WorkRpls); ret = PcsChek(WorkSelR, WorkRpls, rcun1); } break; case 0x29://LTCH代行 SelRltc(AxisSel, Rltc1X, Rltc2X, Rltc1Y, Rltc2Y, Rltc1Z, Rltc2Z, Rltc1U, Rltc2U, &WorkRltc1, &WorkRltc2); if ((rltc1 == WorkRltc1) && (rltc2 == WorkRltc2)) { ret = 1; } break; case 0x24://ERC出力時間幅は、ソフトがRSTSで確認できる十分な値をRENV1.EPW2-0で設定しておくこと(レベルが望ましい) ret = BitChecker(rsts, 0x00000200, 1);//RSTS.SERC=1(bit9) break; case 0x25://ERC出力のリセット ret = BitChecker(rsts, 0x00000200, 0);//RSTS.SERC=0(bit9) break; case 0x04://ソフトリセット if((rfl != 0) || (rfh != 0) || (rmd != 0) || (rcun1 != 0)) { ret = 1; } break; default: ret = 0; break; } return(ret); } /////////////////////////////////////////////////////////////////// // // // 引数: // 戻り:0=処理成功、 1=処理失敗 // int PortCommandCheck(char RCom, unsigned long WriteD, char AxisSel) { int ret = 0; char WorkSel; unsigned long PortD; //汎用ポートの読込み WorkSel = SelectAxis(AxisSel) | 0x30; //<<<<< WorkSelにより、汎用ポートを読み込んでください >>>>> // SPIからWorkSelを出力 // SPIに2バイトのダミーを出力しながらレジスタデータを「PortD」に取込む // ======= if((WriteD & 0x000000FF) != (PortD & 0x000000FF)) { ret = 1; } return(ret); } /////////////////////////////////////////////////////////////////// // 軸選択コマンドで複数軸の指定がある場合、1軸だけを選択する // // 引数:AxisSel :書込みコマンドで使用した軸選択コマンド // 戻り:WorkSel :リードバックで使用する軸選択コマンド // char SelectAxis(char AxisSel) { char WorkChar; WorkChar = AxisSel & 0xF0; if((AxisSel & 0x01) == 0x01) { WorkChar = WorkChar | 0x01; } else if((AxisSel & 0x02) == 0x02) { WorkChar = WorkChar | 0x01; } else if((AxisSel & 0x04) == 0x04) { WorkChar = WorkChar | 0x04; } else if((AxisSel & 0x08) == 0x08) { WorkChar = WorkChar | 0x08; } else { WorkChar = WorkChar | 0x01; } return(WorkChar); } /////////////////////////////////////////////////////////////////// // レジスタ(ステータス)の指定したビット状態を調べる // // 引数:RegD=レジスタ(ステータス)の値 // mask=1が立っている部分が指定ビット // val =0:指定ビットがゼロになっているかを確認 // 1:指定ビットが1になっているかを確認 // 戻り:1=指定した状態とは異なっていた // 0=指定した状態にマッチした // int BitChecker(unsigned long RegD, unsigned long mask, unsigned long val) { unsigned long subval; if(val==0) { subval = val; } else { subval = mask; } // if((RegD & mask ) == subval) { return (0);//match } else { return (1); } } /////////////////////////////////////////////////////////////////// // レジスタ(ステータス)の値が指定した値と同じか否かを調べる // // 引数:RegD=レジスタ(ステータス)の値 // val =指定する値 // 戻り:1=指定した値とは異なっていた // 0=指定した値にマッチした // int RegChecker(unsigned long RegD, unsigned long val) { if ( RegD == val ) { return (0);//match } else { return (1); } } /////////////////////////////////////////////////////////////////// // 現在速度が指定した速度と一致するか調べる // // 引数:SetSpeed=指定速度 // NowSpeed=現在速度(RSPD) // 戻り:1=指定した値とは異なっていた // 0=指定した値にマッチした // int SpeedChecker(unsigned long SetSpeed, unsigned long NowSpeed) { NowSpeed = NowSpeed & 0x00003FFF; SetSpeed = SetSpeed & 0x00003FFF; if (NowSpeed == SetSpeed) { return (0);//match } else { return (1); } } /////////////////////////////////////////////////////////////////// // 指定軸のラッチレジスタ選択 // // 引数:AxisSel :書込みコマンドで使用した軸選択コマンド // Rltc1X :X軸のラッチレジスタ1 // Rltc2X :X軸のラッチレジスタ2 // Rltc1Y :Y軸のラッチレジスタ1 制御対象が「PCL6114」の場合はゼロを指定 // Rltc2Y :Y軸のラッチレジスタ2 制御対象が「PCL6114」の場合はゼロを指定 // Rltc1Z :Z軸のラッチレジスタ1 制御対象が「PCL6114」、「PCL6124」の場合はゼロを指定 // Rltc2Z :Z軸のラッチレジスタ2 制御対象が「PCL6114」、「PCL6124」の場合はゼロを指定 // Rltc1U :U軸のラッチレジスタ1 制御対象が「PCL6114」、「PCL6124」の場合はゼロを指定 // Rltc2U :U軸のラッチレジスタ2 制御対象が「PCL6114」、「PCL6124」の場合はゼロを指定 // 戻り:WorkRltc1:選択されたラッチレジスタ1の値 // WorkRltc2:選択されたラッチレジスタ2の値 // void SelRltc(char AxisSel, unsigned long Rltc1X, unsigned long Rltc2X, unsigned long Rltc1Y, unsigned long Rltc2Y, unsigned long Rltc1Z, unsigned long Rltc2Z, unsigned long Rltc1U, unsigned long Rltc2U, unsigned long *WorkRltc1, unsigned long *WorkRltc2) { if((AxisSel & 0x01) == 0x01) { *WorkRltc1 = Rltc1X; *WorkRltc2 = Rltc2X; } else if((AxisSel & 0x02) == 0x02) { *WorkRltc1 = Rltc1Y; *WorkRltc2 = Rltc2Y; } else if((AxisSel & 0x04) == 0x04) { *WorkRltc1 = Rltc1Z; *WorkRltc2 = Rltc2Z; } else if((AxisSel & 0x08) == 0x08) { *WorkRltc1 = Rltc1U; *WorkRltc2 = Rltc2U; } else { *WorkRltc1 = Rltc1X; *WorkRltc2 = Rltc2X; } } /////////////////////////////////////////////////////////////////// // 指定軸の位置きめカウンタ選択 // // 引数:AxisSel :書込みコマンドで使用した軸選択コマンド // RplsX :X軸の位置きめカウンタ // RplsY :X軸の位置きめカウンタ 制御対象が「PCL6114」の場合はゼロを指定 // RplsZ :X軸の位置きめカウンタ 制御対象が「PCL6114」、「PCL6124」の場合はゼロを指定 // RplsU :X軸の位置きめカウンタ 制御対象が「PCL6114」、「PCL6124」の場合はゼロを指定 // 戻り:WorkRpls:選択された位置きめカウンタの値 // void SelRpls(char AxisSel, unsigned long RplsX, unsigned long RplsY, unsigned long RplsZ, unsigned long RplsU, unsigned long *WorkRpls) { if((AxisSel & 0x01) == 0x01) { *WorkRpls = RplsX; } else if((AxisSel & 0x02) == 0x02) { *WorkRpls = RplsY; } else if((AxisSel & 0x04) == 0x04) { *WorkRpls = RplsZ; } else if((AxisSel & 0x08) == 0x08) { *WorkRpls = RplsU; } else { *WorkRpls = RplsX; } } /////////////////////////////////////////////////////////////////// // 比較不要ビットをマスクする値の取得 // // 引数:RCom:レジスタライト処理で使用したコマンド // 戻り:マスクデータ // unsigned long SetRegMask(char RCom) { unsigned long RegMask; switch(RCom) { case (char)0x80://PRMV case (char)0x90://RMV RegMask = 0xFFFFFFFF; break; case (char)0x81://PRFL case (char)0x91://RFL RegMask = 0x00003FFF; break; case (char)0x82://PRFH case (char)0x92://RFH RegMask = 0x00003FFF; break; case (char)0x83://PRUR case (char)0x93://RUR RegMask = 0x0000FFFF; break; case (char)0x84://PRDR case (char)0x94://RDR RegMask = 0x0000FFFF; break; case (char)0x85://PRMG case (char)0x95://RMG RegMask = 0x00000FFF; break; case (char)0x86://PRDP case (char)0x96://RDP RegMask = 0x00FFFFFF; break; case (char)0x87://PRMD case (char)0x97://RMD RegMask = 0x3FFFFFFF; break; case (char)0x88://PRIP case (char)0x98://D8h RegMask = 0xFFFFFFFF; break; case (char)0x89://PRUS case (char)0x99://RUS RegMask = 0x00001FFF; break; case (char)0x8A://PRDS case (char)0x9A://RDS RegMask = 0x00001FFF; break; case (char)0x9C://RENV1 RegMask = 0xFFFFFFFF; break; case (char)0x9D://RENV2 RegMask = 0x7FFFFFFF; break; case (char)0x9E://RENV3 RegMask = 0x03FFFFFF; break; case (char)0xA3://RCUN1 RegMask = 0xFFFFFFFF; break; case (char)0xA4://RCUN2 RegMask = 0xFFFFFFFF; break; case (char)0xA7://RCMP1 RegMask = 0xFFFFFFFF; break; case (char)0xA8://RCMP2 RegMask = 0xFFFFFFFF; break; case (char)0xA9://RCMP3 RegMask = 0xFFFFFFFF; break; case (char)0xAA://RCMP4 RegMask = 0xFFFFFFFF; break; case (char)0xAC://RIRQ RegMask = 0x00001FFF; break; case (char)0xB2://REST RegMask = 0x000007FF; break; case (char)0xB3://RIST RegMask = 0x0000FFFF; break; case (char)0xBA://RGPM RegMask = 0x0000FFFF; break; case (char)0xBB://RGPD RegMask = 0x0000FFFF; break; default :RegMask = 0x00000000; break; } return(RegMask); } /////////////////////////////////////////////////////////////////// // 停止確認 // // 引数:WorkSelR :レジスタ読出し用の軸選択コマンド // WorkSelS :メインテータス読出し用の軸選択コマンド // WorkSelS :サブテータス読出し用の軸選択コマンド // rcun1 :カウンタ1レジスタの値 // 戻り:0=処理成功、 1=処理失敗 // int StopChek(char WorkSelR, char WorkSelM, char WorkSelS, unsigned long rcun1) { unsigned long mstsw; unsigned long sstsw; unsigned long WorkRcun; int ret = -1; while(ret < 0) { //<<<<< ステータス、サブステータス、カウンタ1(RCUN1)からデータを読み込んでください >>>>> // //ステータスリード // SPIからWorkSelMを出力 // SPIに1バイトのダミーを出力しながらデータを「mstsw」に取込み、上位3バイトはゼロとする。 // ======= // //サブステータスリード // SPIからWorkSelSを出力 // SPIに2バイトのダミーを出力しながらデータを「sstsw」に取込む、上位2バイトはゼロとする。 // ====== // //RCUN1リード // SPIからWorkSelRを出力 // SPIから"0xE3"を出力 // SPIに4バイトのダミーを出力しながらレジスタデータを「WorkRcun」に取込む // ========== //減速中の場合、減速完了まで待ってから停止確認を行う // (減速中に減速停止コマンドを書込んだ場合でも正確に判断させるため) if((BitChecker(sstsw, 0x00000200, 1)) == 1) //減速中ではない { if((BitChecker(mstsw, 0x00000001, 0)) == 0) //停止した { ret = 0; //成功 break; } else if((BitChecker(mstsw, 0x00000002, 0)) == 0) //停止してないのにパルスは出力されていない { ret = 1; //失敗 CSTA待ちなどの解除に失敗 break; } if( ((rcun1 + 1) < WorkRcun) || ((rcun1 - 1) > WorkRcun)) { ret = 1; //失敗 パルスが止まっていない break; } } } return(ret); } /////////////////////////////////////////////////////////////////// // PCS代行確認 // // 引数:rpls :レジスタ読出し用の軸選択コマンド // rcun1 :カウンタ1レジスタの値 // 戻り:0=処理成功、 1=処理失敗 // int PcsChek(char WorkSelR, unsigned long rpls, unsigned long rcun1) { unsigned long WorkRpls; unsigned long WorkRcun; int ret = -1; while(ret < 0) { //<<<<< 位置きめカウンタ(RPLS)、カウンタ1(RCUN1)からデータを読み込んでください >>>>> // //RPLSリード // SPIからWorkSelRを出力 // SPIから"0xE3"を出力 // SPIに4バイトのダミーを出力しながらレジスタデータを「WorkRpls」に取込む // ========== // //RCUN1リード // SPIからWorkSelRを出力 // SPIから"0xE3"を出力 // SPIに4バイトのダミーを出力しながらレジスタデータを「WorkRcun」に取込む // ========== //パルスが出力されるまで位置きめカウンタは変化しないので、パルス出力を待つ if(WorkRcun != rcun1) //パルスが出力された { if(WorkRpls == rpls) //位置きめカウンタが動作したか { ret = 1; //失敗 break; } else { ret = 0; //成功 break; } } } return(ret); }