ステータ電流による鉱石重量の測定。 練習。 パート2. MKでのソフトウェア実装

シリーズの最後の部分「ミネラルの重量の測定」 。 この記事では、MKでのソフトウェアの実装について説明します。



フェーズローターを備えた高電圧非同期モーターを備えた鉱山のリフティング設備(サイロ)のステーターの電流に応じて鉱物の重量を測定するこの方法の基本を思い出してください。





序文の代わりに



実際のデバイスは設計または製造されていないため、Proteusソフトウェアパッケージを使用してこのプロセスをシミュレートしました。 このシミュレータは多くの異なるMKをサポートしており、サポートされているMKのリストから、アルゴリズムを実装してメソッド全体を検証するためにハードウェアプラットフォームが選択されました。



まえがき



シミュレーション中にテストを実行するために、 最初の部分に示されているプロテウスの初期スキームが変更されました。 変更を検討してください。



スキームの最初のシート。 写真はクリック可能です。



この変化は電圧信号の伝播に影響を及ぼし、電流回路を破壊し、誘導回路を負荷回路に導入しました。



スキームの2番目のシート。 写真はクリック可能です。



ComPimコンポーネントは、システムポートとの通信に使用されます。 MK社のマイクロチップ。 最初のシートからの入力信号。 電圧および電流パラメータを視覚的に制御するためのデバイス(電圧計、電流計)。 スイッチを使用して、電流チャネルと電圧チャネルの中間点を自動的に計算します。



はじめに



MK PIC18F2580用のプログラムを作成するとき、無料のIDE MpLab X v 2.26、XC8 v1.20コンパイラを使用しました。

プログラムの開発中に、独自の数学関数を作成する必要がありました。







コンパイラが使用する標準関数は速度の点で適切ではありませんでした。これは16x16乗算に適用されます。 しかし、32ビット整数から平方根を抽出するライブラリ関数はありませんでした。



プロジェクトでは、カスタム変数タイプも使用しました。 使いやすさのために導入されています。



カスタム変数タイプは、user_type.hヘッダーで説明されています



MK初期化



MKの初期化は、プロジェクト内の別のモジュールで行われます。 MKのデータシートに従って作成されます。 初期化モジュールのヘッダーには、構成ビット(ヒューズ)が含まれています。 MKデータの場合、これらのヒューズはファームウェア、.hexファイルに縫い付けることができます。



ここがリーダーです。



#include <xc.h> /*     */ #pragma config IESO = OFF #pragma config OSC = HSPLL //HS oscillator, PLL enabled (Clock Frequency = 4 x FOSC1) #pragma config MCLRE = ON //MCLR pin enabled; RE3 input pin disabled #pragma config XINST = OFF //Instruction set extension and Indexed Addressing mode disabled (Legacy mode) #pragma config PBADEN = OFF //PORTB<4:0> pins are configured as digital I/O on Reset /*      */ void INT_init(void); void T0_init(void); void ADC_init(void); void USART_init(int BAUD); void T2_init(void); void PIC_init(void);
      
      







必要な周辺機器を独自の関数で初期化します。



このMKの割り込みが優先されます。 レベルは、高と低の2つだけです。 タイマー0からの割り込みは、電圧および電流信号を測定するための時間間隔(サンプル)をカウントするため、優先度が高くなります。これは、タイムクリティカルであり、残りは低いためです。



ADCによる信号処理



外部割り込みINT1に接続されている検出器からの割り込みにより、200μs間隔のカウントダウンでタイマーを開始します。 タイマーを中断することにより、正確な参照のために事前定義された値をタイマーにロードし、両方のチャネルからADC値を読み取り、予備計算を実行します。

  if (Count_sample<SAMPLE){ //      ADCON0bits.GO_DONE=1; //   while(ADCON0bits.GO_DONE); //  ADCON0bits.CHS0=0; //   I_adc.byte.HB=ADRESH; I_adc.byte.LB=ADRESL; //   I_int=(INT)I_adc.Val-I_0.Val; /* *         *   ,   *        88 *     ,  *    1616=32      , *    *  854  288     302   , *      *        ,    *     */ I_sum+=(SLONG)mul_int(I_int,I_int); ADCON0bits.GO_DONE=1; //   while(ADCON0bits.GO_DONE); //  ADCON0bits.CHS0=1; //      U_adc.byte.HB=ADRESH; U_adc.byte.LB=ADRESL; //   U_int=(INT)U_adc.Val-U_0.Val; U_sum+=(SLONG)mul_int(U_int,U_int); P_act+=(SLONG)mul_sint(U_int,I_int); Count_sample++; } if (Count_sample>=SAMPLE){ // ,   Count_sample=0; Flag_izm=1; T0CONbits.TMR0ON=0; }
      
      







メインループでは、 Flag_izmフラグを使用して、追加の中間計算実行します。

 if (Flag_izm){ //  Flag_izm=0; if (Count_main_sample<MAIN_SAMPLE){ U_d+=(SLONG)U_sum; U_sum=0; I_d+=(SLONG)I_sum; I_sum=0; P_m+=(SLONG)P_act; P_act=0; Count_main_sample++; } }
      
      







ModBus RTUプロトコル



この実装では、「外部」世界との通信はUSART MKを使用して実行され、工業用プロトコルModBus RTUがこのインターフェースを介して適用されます。 このプロトコルの実装は非常に単純であり、リソース集約型ではありません。 メッセージは、USARTレシーバーから割り込みで受信されます。

  /*    */ if (PIR1bits.RCIF){ if (RCSTAbits.FERR || RCSTAbits.OERR) { /*   */ RCSTAbits.CREN=0; /*    */ RCSTAbits.CREN=1; /*     */ } MODBUS.rxtimer=0; /*       */ if(MODBUS.rxcnt>(BUF_SZ-2)) MODBUS.rxcnt=0; MODBUS.buffer[MODBUS.rxcnt++]=RCREG1; /*      ModBus*/ PIR1bits.RCIF=0; /*     */ }
      
      







マスターからのメッセージの処理は、タイムクリティカルな測定が完了するメインサイクルで行われます。

 if (Flag_izm){ //  … if (MODBUS.rxgap){ //   MODBUS_SLAVE(&MODBUS); //  MODBUS.rxgap=0; } }
      
      







USART送信は、最適なブロッキング方法で編成されていません。

 /* *     */ void TX_FRAME(UART_DATA *MODBUS) { RCSTAbits.CREN=0; TXSTAbits.TXEN=1; INTCONbits.GIEH=0; /*     */ INTCONbits.GIEL=0; while(MODBUS->txcnt<MODBUS->txlen){ TXREG=MODBUS->buffer[MODBUS->txcnt++]; while(!PIR1bits.TXIF) NOP(); } INTCONbits.GIEH=1; INTCONbits.GIEL=1; MODBUS->txlen=0; RCSTAbits.CREN=1; }
      
      







ModBus Registerテーブルの記入



ModBusプロトコルにより、機器開発者は、カード内のどのレジスターがどのパラメーターを担当するかを自分で決定できます。 この問題には厳格なルールはありません。 したがって、複雑で合理的ではないものは思いつきません。



最初のレジスタ(ゼロ)から始めましょう。 実効電圧の値をReal形式で入力します。つまり、この値は2つの16ビットModbusレジスタを占有します。 さらに、電流、有効電力、皮相電力、余弦の値。

  res_table[0].Val=U_real.word.LW; //   res_table[1].Val=U_real.word.HW; //,    res_table[2].Val=I_real.word.LW; res_table[3].Val=I_real.word.HW; res_table[4].Val=P_real.word.LW; res_table[5].Val=P_real.word.HW; res_table[6].Val=P_pol.word.LW; res_table[7].Val=P_pol.word.HW; res_table[8].Val=Cos_p.word.LW; res_table[9].Val=Cos_p.word.HW;
      
      





これで、これらのレジスタの値のマスターから要求されると、デバイスは完全に適切なデータで応答します。



デバイスからのデータを表示するには、この段階でOPCサーバーを使用します。 その内部ツールは、データの表示、レジスタへの値の書き込みなどに十分です。



自動チャネル中点検出および係数計算



測定を行うには、電圧信号と電流信号の正弦波の中点を計算する必要があります。 この場合、 前の記事で説明したアルゴリズムを使用します。



ADC0チャネルを自動的に計算するには、チャネルから有用な信号を削除する必要があります。 ACS712電流センサーが接続されている電流ループを切断し、中点をオペアンプと電圧入力に接続します。 次に、アルゴリズムは信号の二乗平均値を計算し、マスターからのコマンドに応じて、各チャネルのADC0に計算値を入力し、これらの値をEEPROMに書き込みます。 その後、調査した電圧信号と電流信号を接続します。

 if (MODBUS.write){ if (res_table[10].Val==1){ //   U_0.Val=(WORD)U_real.Val; // 0 I_0.Val=(WORD)I_real.Val; eeprom_write(0,U_0.byte.HB); //    eeprom_write(1,U_0.byte.LB); //0   eeprom_write(2,I_0.byte.HB); eeprom_write(3,I_0.byte.LB); } }
      
      





係数を計算するには、次の手順を使用します。 チャンネルの中間点を計算し、実際の信号をアナログ入力に接続した後、アルゴリズムはADCユニットのrms電圧と電流を計算します。 これらを物理量に変換するには、これらの信号をデバイス、電圧計、電流計で測定する必要があります。 機器によって測定された値は必要なModbasレジスタに記録され、マスターからのコマンドで係数を計算します。 この実装では、Modbasパッケージの長さを減らすために、デバイスからの値は、電圧値に10を掛け、現在の値に100を掛けて整数値に変換されます。受信したデータはレジスタに書き込まれ、マスターからのコマンドによって係数が計算されます。 計算された係数はEEPROMに記録されます。

  if (MODBUS.write){ if (res_table[10].Val==2){ //    K_u.Val=U_real.Val/res_table[11].Val; //   K_u.Val*=10.0; K_i.Val=I_real.Val/res_table[12].Val; K_i.Val*=100.0; eeprom_write(4,K_u.byte.MB); //  eeprom_write(5,K_u.byte.UB); eeprom_write(6,K_u.byte.HB); eeprom_write(7,K_u.byte.LB); eeprom_write(8,K_i.byte.MB); eeprom_write(9,K_i.byte.UB); eeprom_write(10,K_i.byte.HB); eeprom_write(11,K_i.byte.LB); } res_table[10].Val=0; MODBUS.write=0; }
      
      







重量計算



鉱石の重さはストーリーの最初の部分で与えられた式から直接計算できます。







どこで:





この実装では、プロテウスのシミュレーションではそのような機会が提供されないため、質量測定は実行されません。

プロテウスのシミュレーションにより、「固定子電流による吊り上げ容器での輸送中の鉱石の重量の測定」という主要なアイデアの実行可能性を理解することができます。



MpLab Xのプロジェクトとプロテウスプロジェクトファイルのアーカイブはこちらです。



電圧および電流信号の処理、有効電力の計算、コサインファイおよび皮相電力を示すビデオを以下に示します。







おわりに



業界で抽出された鉱物の重量の測定は、技術会計、実行された作業の有効性の評価などで非常に重要です。



鉱石の質量を測定するために、多くの異なるタイプとタイプの計量装置が使用されます。



この一連の記事では、持ち上げ船で貨物を輸送する際のサイロ駆動モーターの発生モーメントを測定することにより、鉱石の重量を測定する可能性を調べました。 この方法は、DCモーターを備えたサイロで使用され、一定の励起を伴う電機子電流から質量が計算されます。



PS



世界の鉱業は大量に行われ、削減の前提条件がないため、この技術会計のための鉱石スケールの測定方法には生命権があります。 そして、近い将来、この原理に基づいて、リフティング船の貨物の質量を測定するための産業機器が登場するでしょう。



All Articles