2012-09-24 10 views
5

Senden war ich in der Lage, eine Verbindung mit einer SPS zu machen Daten von ihm zu lesen. Jetzt gibt es ein Problem und es ist, dass ich eine Methode schreiben muss, um die Daten von der PLC zu ändern. Um dies zu erreichen, muss ich zwei Werte an die SPS senden: einen int-Wert und einen booleschen Wert. Den int-Wert habe ich über die Klassen aus dem Paket net.wimpi.modbus gelöst. Aber wenn es um den booleschen Wert geht, habe ich keine Ahnung, was ich tun soll.einen Booleschen Wert an eine SPS von Android

Wenn jemand das gleiche Problem hatte wie ich jetzt, könnten Sie mir bitte eine Referenz schicken, wo ich eine Lösung oder einen Link von einem wirklich guten Tutorial kann mein Problem zu lösen? Jemand hat ein paar Links in this question aber es schickt mich zu Tutorials, die nicht viel hat mit der Kommunikation mit der SPS zu tun und wie die Daten des SPS zu behandeln.

EDIT

machte ich die Verbindung mit einer Modicon M340-SPS und für die Verbindung verwende ich die Klassen des net.wimpi.modbus Pakets. Ich habe die Verbindung in meinem Code durch die Klassen ModbusTCPTransaction und TCPMasterConnection, und ich las die Werte durch die Klassen ReadMultipleRegistersRequest und ReadMultipleRegistersResponse.

Der Code, den ich für die Verbindung hergestellt:

private InetAddress m_Address; 
private ModbusTCPTransaction m_Transaction = null; 
private TCPMasterConnection m_Connection = null; 

int port = Modbus.DEFAULT_PORT; 
private Activity activity; 


public ModbusConnection(Activity activity, String ip) 
{ 
    this.activity = activity; 

    try { 
     m_Address = InetAddress.getByName(ip); 
    } catch (UnknownHostException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } // the slave'saddress 
} 

public void getTransaction(InetAddress inet) throws Exception 
{ 
    /*Variables for the reading of the PLC data*/ 
    int port = Modbus.DEFAULT_PORT; 

    /*Data initialization for the reading of the PLC data*/ 
    m_Connection = new TCPMasterConnection(inet); 
    m_Connection.setPort(port); 
    m_Connection.connect(); 
    m_Transaction = new ModbusTCPTransaction(m_Connection); 
} 

und die Werte zu lesen, rufe ich den nächsten Code die ganze Zeit. Ich erreicht nur Lesen und Schreiben int, String und float Werte durch Worte, die ich von einem auf der SPS erklärt lesen Offset:

private ReadMultipleRegistersResponse readValues(int offset, int count) 
{ 
    ReadMultipleRegistersRequest rReq = null; // the request 
    ReadMultipleRegistersResponse rRes = null; // the response 

    try { 

     rReq = new ReadMultipleRegistersRequest(offset, count); 
     m_Transaction.setRequest(rReq); 
     m_Transaction.execute(); 
     rRes = (ReadMultipleRegistersResponse) m_Transaction.getResponse(); 

    } catch (Exception e) { 
     e.printStackTrace(); 
     Log.i("AsyncTask", "doInBackground: Exception"); 
    } 
    return rRes;  
} 

EDIT 2

Ich glaube, ich erreicht, was ich wollte. Es gibt vier Klassen, die ich die Spulen, um zu lesen:

ReadCoilsRequest ReadCoilsResponse WriteMultipleCoilsRequest WriteMultileCoilsResponse

Was ich getan habe ist zwei Methoden zum Lesen und Schreiben Spulen in die SPS:

private ReadCoilsResponse readBytes(int offset, int count) 
{ 
    ReadCoilsRequest rReq = null; // the request 
    ReadCoilsResponse rRes = null; // the response 

    try { 

     rReq = new ReadCoilsRequest(offset, count); 
     m_Transaction.setRequest(rReq); 
     m_Transaction.execute(); 
     rRes = (ReadCoilsResponse) m_Transaction.getResponse(); 

    } catch (Exception e) { 
     e.printStackTrace(); 
     Log.i("AsyncTask", "doInBackground: Exception"); 
    } 
    return rRes;  
} 

    public void writeBytes(int wordNumber, BitVector b) { 
    try {    
     WriteMultipleCoilsRequest wReq = null; // 
     WriteMultipleCoilsResponse wRes = null; // 

     wReq = new WriteMultipleCoilsRequest(211, b); 
     m_Transaction.setRequest(wReq); 
     m_Transaction.execute();  
    } catch (Exception e) { 
     e.printStackTrace(); 
     Log.i("AsyncTask", "doInBackground: Exception"); 
    } 
} 

Auch habe ich eine Methode Bitvektor Variablen mit den Spulen Klassen zu lesen:

public BitVector readBitVector(int offset, int count) 
{ 
    BitVector myBitVector; 

    ReadCoilsResponse rRes = readBytes(offset, count); 
    rRes = (ReadCoilsResponse) m_Transaction.getResponse(); 
    myBitVector = rRes.getCoils(); 

    return myBitVector; 
} 

Danach, was ich das Bit auf 1 oder 0 wird mit einer nativen Funktion aus der Bitvektor-Klasse aus dem net.wimpi.modbus.util Paket in meinem Code setzen verwendet:

test.setBit(2, true); 

HINWEIS: Es ist wichtig, daran zu denken, dass jedes Mal, wenn Sie Werte in der SPS lesen oder schreiben wollen, der beste Weg dies zu tun, ein Öffnen der Verbindung zur SPS ist.

+1

Hinweis: Sie können einfach "Probleme mit" aus dem Titel Ihrer Fragen auf SO verlassen. Wenn Sie es hier veröffentlichen, bedeutet dies, dass einige Probleme gelöst werden müssen. –

+1

Können Sie uns sagen, was Sie bereits versucht haben. Und welche SPS ist das? Wie hast du die Verbindung hergestellt? Dies könnte die Art beeinflussen, wie Booleans behandelt werden. – Fildor

+0

@Fildor Ich habe gerade meine Frage bearbeitet und die Fragen beantwortet, die Sie mir gestellt haben –

Antwort

2

Meine endgültige Antwort ist: Sie können die Register als Bits zu behandeln haben. Wenn Sie also das zweite Bit eines Registers in einem int-Wert im Code dargestellt schreiben wollen, werden Sie so etwas zu tun haben:

intValue = m_Data[1].getValue(); 
intValue = intValue | 2; 
m_Data[1].setValue(intValue); 

Die zweite Zeile ändert das Bit ich in meiner SPS schreiben möchten .