2015-01-28 6 views
0

홀 센서를 사용하여 현 전류를 측정하기 위해 Arduino modbus 라이브러리를 사용하고 있습니다. 현재 라이브러리가 다운로드되었습니다. Modbus library. 센서 데이터가 부동 값 &입니다. 라이브러리는 정수 값 형식으로 값을 저장합니다.Modbus 부동 소수점 변환

질문 : 사용자 정의 주소를 할당하는 방법을 정수 형식

  • 에 센서 값을 절약 할 수있는 방법

    1. . 4000H 대신 0000H

    코드

    #include <avr/wdt.h> 
    #include"glob.h" 
    //#define ID 1 
    void Device_ID_Reading() 
    { 
        for(row=0;row<9;row++) 
        { 
        digitalWrite(SO_enable,array1[row][0]); 
        digitalWrite(S1_enable,array1[row][1]); 
        digitalWrite(S2_enable,array1[row][2]); 
        Status_Out[row]=digitalRead(Read_IDstatus); 
        Device_ID =1*Status_Out[0]+2*Status_Out[1]+4*Status_Out[2]+8*Status_Out[3]+16*Status_Out[4]+32*Status_Out[5]+64*Status_Out[6]+128*Status_Out[7]; 
        Serial.print("Device_ID"); 
        Serial.print(row); 
        Serial.print(":\t"); 
        Serial.println(Device_ID); 
    
        } 
    } 
    
    
    int8_t state = 0; 
    Modbus slave(Device_ID, 0, 0); 
    unsigned long tempus; 
    // data array for modbus network sharing 
    uint16_t au16data[30]; 
    
    void Take_Reading() 
    { 
        for(row=0;row<9;row++) 
        { 
        // int k=(8*array[row][0]+4*array[row][1]+2*array[row][2]+1*array[row][3]); 
        // digitalWrite(Enablepin,array[row][0]); 
        digitalWrite(SO_enable,array1[row][1]); 
        digitalWrite(S1_enable,array1[row][2]); 
        digitalWrite(S2_enable,array1[row][3]); 
        //delay(100); 
        Sensor_Value0=analogRead(A0); 
        Sensor_Value1=analogRead(A5); 
        Mux1_array[row]=(Sensor_Value0 * ARDUINO_ANALOG_SCALING); 
        Mux2_array[row]=(Sensor_Value1 * ARDUINO_ANALOG_SCALING); 
    
        Current_Value1[row]= (Mux1_array[row]*35.1428571429)-87.6571428571; 
        Current_Value2[row]= (Mux2_array[row]*35.1428571429)-87.6571428571; 
        Current_Value3[row]=(Mux3_array[row]*35.1428571429)-87.6571428571; 
    
        } 
    } 
    void setup() 
    { 
        wdt_enable(WDTO_8S); 
        slave.begin(9600); 
        tempus = millis() + 100; 
        pinMode(3,OUTPUT); 
        pinMode(SO_enable, OUTPUT) ;// pin can enable/disable using digital IO 7 of arduino 
        pinMode(S1_enable, OUTPUT) ;// pin can enable/disable using digital IO 6 of arduino 
        pinMode(S2_enable, OUTPUT) ;// pin can enable/disable using digital IO 5 of arduino 
        // pinMode(Enablepin, OUTPUT) ;// pin can enable/disable using digital IO 4 of arduino 
        pinMode(A0, INPUT) ; 
        pinMode(A1, INPUT) ; 
        pinMode(A2,INPUT); 
        // Serial.begin(9600); 
    } 
    void loop() 
    { 
        digitalWrite(3,HIGH); 
        // wdt_reset(); 
        Take_Reading(); 
        Device_ID_Reading(); 
        state = slave.poll(au16data,30); 
        if (state > 4) { 
        tempus = millis() + 50; 
        digitalWrite(13, HIGH); 
        } 
        if (millis() > tempus) digitalWrite(13, LOW); 
    
        Modbus_call(); 
    
    } 
    void Modbus_call() 
    { 
    
        /*reading of coil where i can succefully read value*/ 
        au16data[1]=(int)(100*Current_Value1[0]); 
        au16data[2]=(int)(100*Current_Value1[1]); 
        au16data[3]=(int)(100*Current_Value1[3]); 
        au16data[4]=(int)(100*Current_Value1[4]); 
        au16data[5]=(int)(100*Current_Value1[5]); 
        au16data[6]=(int)(100*Current_Value1[6]); 
        au16data[7]=(int)(100*Current_Value1[7]); 
        au16data[8]=(int)(100*Current_Value1[8]); 
        au16data[9]=(int)(100*Current_Value2[0]); 
        au16data[10]=(int)(100*Current_Value2[1]); 
        au16data[11]=(int)(100*Current_Value2[2]); 
        au16data[12]=(int)(100*Current_Value2[3]); 
        au16data[16]=(int)(100*Current_Value2[4]); 
        au16data[17]=(int)(100*Current_Value2[5]); 
        au16data[18]=(int)(100*Current_Value2[6]); 
        au16data[19]=(int)(100*Current_Value2[7]); 
        uint16_t calcCRC(au16data[15]); 
        au16data[13] = slave.getInCnt(); 
        au16data[14] = slave.getOutCnt(); 
        au16data[15] = slave.getErrCnt(); 
    
    } 
    

    같은 주소를 시작 내가 직접 부동 소수점을 사용할 수있는 다른 라이브러리가있다.

  • 답변

    0

    프로토콜로 Modbus는 직접 수레를 지원하지 않습니다. 그러나 플로트 데이터를 인접 레지스터에 넣을 수 있습니다. float 데이터를 레지스터에 넣고 다른 쪽을 당겨 빼내려면 type punning을 사용하십시오.

    union Pun {float f; uint32_t u;}; 
    
    void encodeFloat(uint16_t *regs, float x) 
    { 
        union Pun pun; 
    
        pun.f = x; 
        regs[0] = (pun.u >> 16) & 0xFFFFU; 
        regs[1] = pun.u & 0xFFFFU; 
    } 
    
    float decodeFloat(const uint16_t *regs) 
    { 
        union Pun pun; 
    
        pun.u = ((uint32_t)regs[0] << 16) | regs[1]; 
        return pun.f; 
    } 
    

    당신은 너무처럼 사용합니다 :

    void Modbus_call() 
    { 
        /*reading of coil where i can succefully read value*/ 
        encodeFloat(&au16data[ 0], Current_Value1[0]); 
        encodeFloat(&au16data[ 2], Current_Value1[1]); 
        encodeFloat(&au16data[ 4], Current_Value1[2]); 
        /* And so on... */ 
    } 
    
    관련 문제