2017-08-03 51 views
0

我想將Arduino與PLC連接來提取一些信息。增量索引在for循環結束時不會改變

我的問題是在功能3:設置報警標誌/重置標誌。此功能用於比較歷史值和當前值。我試圖處理一些整數(test_number)並像二進制16位數據一樣處理,以便在某處找到1。我發現Findbit函數中的for循環應該重複16次,無限運行。它不會改變其仍停留在1

增量指標(變量名BIT_1)這是我的代碼:

int test_number_array[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 
int test_number = 0; 
int bit_1 = 0; 
int Andbit = 0; 
const char* message; 
int flagAlarm[2][16] = {}; 
int flagReset[2][16] = {}; 


void setup() 
{ 
    // put your setup code here, to run once: 
    Serial.begin(9600); 
} 

void loop() 
{ 
    // put your main code here, to run repeatedly: 
    for (int j = 1; j <= 2; j++) 
    { 
    for (int i = 1; i <= 2; i++) // Example with 2 modbus address 
    { 
     unsigned int address = 40000 + i; 
     Serial.print ("Modbus address = "); 
     Serial.println(address, DEC); 
     pull_data(i); 
     Serial.print("Test number is "); 
     Serial.println(test_number); 
     Findbit(i); 
     Serial.println("------------------------------------------------- "); 
    } 
    } 
    while (1) 
    { 

    } 
} 

// ---------------Function 1 : Function finding alarm bit-----------------// 

void Findbit(int i) 
{ 
    for (bit_1 = 0; bit_1 <= 15; bit_1++) 
    { 
    Andbit = test_number & 1; 
    Serial.print("Test number (BINARY) is "); 
    Serial.println(test_number, BIN); 
    Serial.print("Check at bit number "); 
    Serial.println(bit_1); 
    Serial.print("And bit is "); 
    Serial.println(Andbit, BIN); 
    Serial.print("flagAlarm(Before1) = "); 
    Serial.println(flagAlarm[i][bit_1]); 
    Serial.print("flagreset(Before1) = "); 
    Serial.println(flagReset[i][bit_1]); 

    if (Andbit == 1)    //found "1" pass into loop 
    { 
     flagAlarm[i][bit_1] = 1; 
    } 

    else 
    { 

    } 
    Serial.print("flagAlarm(Before2) = "); 
    Serial.println(flagAlarm[i][bit_1]); 
    Serial.print("flagreset(Before2) = "); 
    Serial.println(flagReset[i][bit_1]); 
    Set_reset_flag(i,bit_1); 
    test_number = test_number >> 1; 
    Serial.print("flagAlarm(After) = "); 
    Serial.println(flagAlarm[i][bit_1]); 
    Serial.print("flagreset(After) = "); 
    Serial.println(flagReset[i][bit_1]); 
    Serial.println(" "); 
    } 
} 

// -----------------------Function 2 : Pull data------------------------- // 

int pull_data(int i) 
{ 
    i = i - 1; 
    test_number = test_number_array[i]; 
    return test_number; 
} 


// -------------Function 3 : Set alarm flag/reset flag ---------------- // 

void Set_reset_flag(int i, int bit_1) 
{ 
    Serial.print("i = "); 
    Serial.println(i); 
    Serial.print("bit_1 = "); 
    Serial.println(bit_1); 

    if (flagAlarm[i][bit_1] == 1 && flagReset[i][bit_1] == 0) 
    { 
    Serial.print("Alarm at bit "); 
    Serial.println(bit_1); 
    flagAlarm[i][bit_1] = 0; 
    flagReset[i][bit_1] = 1; 
    } 

    else if (flagAlarm[i][bit_1] == 0 && flagReset[i][bit_1] == 1) 
    { 
    Serial.print("Reset Alarm at bit "); 
    Serial.println(bit_1); 
    flagReset[i][bit_1] = 0; 
    } 

    else if (flagAlarm[i][bit_1] == 1 && flagReset[i][bit_1] == 1) 
    { 
    Serial.print("Alarm still active at bit "); 
    Serial.println(bit_1); 
    flagAlarm[i][bit_1] = 0; 
    flagReset[i][bit_1] = 1; 
    } 
    else 
    { 

    } 

} 

回答

1

難道你BIT_1變量是從沒有提到一些其他的代碼修改在這裏,還是得到最優化?此外,是否有必要使循環計數器成爲全局變量?你可以在Findbit函數中聲明它嗎?

+0

非常感謝。我將bit_1更改爲局部變量,現在就好了。 –