6

PLCと接続してデータを読み込むことができました。ここで問題が 1 つあります。それは、PLC からのデータを変更するメソッドを作成する必要があることです。これを実現するには、int 値と boolean 値の 2 つの値を PLC に送信する必要があります。net.wimpi.modbus パッケージのクラスを介して解決された int 値を取得しました。しかし、ブール値に関しては、どうすればよいかわかりません。

誰かが私と同じ問題を抱えている場合は、私の問題を解決するための解決策または本当に優れたチュートリアルのリンクを見つけることができるリファレンスを送っていただけますか? 誰かがこの質問にいくつかのリンクを投稿しましたが、PLC との通信や PLC のデータの処理方法とはあまり関係のないチュートリアルに移動します。

編集

Modicon M340 PLC と接続し、接続には net.wimpi.modbus パッケージのクラスを使用します。クラス とを介してコード内で接続を確立し、クラスModbusTCPTransactionとをTCPMasterConnection介して値を読み取りました。ReadMultipleRegistersRequestReadMultipleRegistersResponse

接続用に作成したコード:

    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);
}

そして、値を読み取るために、次のコードを常に呼び出します。PLC で宣言されたオフセットから読み取った単語を介して、int、String、および float 値の読み取りと書き込みのみを行いました。

    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;    
}

編集2

やりたいことはできたと思います。コイルを読み取るために使用する 4 つのクラスがあります。

ReadCoilsRequest ReadCoilsResponse WriteMultipleCoilsRequest WriteMultileCoilsResponse

私が行ったことは、コイルを読み込んで PLC に書き込むための 2 つの方法です。

    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");
    }
}

また、Coils クラスを使用して BitVector 変数を読み取るメソッドを作成しました。

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

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

    return myBitVector; 
}

この後、ビットを 1 または 0 に設定するために使用したのは、コードで net.wimpi.modbus.util パッケージの BitVector クラスのネイティブ関数を使用することです。

test.setBit(2, true);

注: PLC に対して値の読み取りまたは書き込みを行う場合は常に、PLC への接続を閉じて開くことが最善の方法であることを覚えておくことが重要です。

4

1 に答える 1

2

私の決定的な答えは、レジスタをビットとして扱わなければならないということです。したがって、int 値で表されるレジスタの 2 番目のビットをコードに書き込みたい場合は、次のようにする必要があります。

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

2 行目は、PLC に書き込みたいビットを変更します。

于 2012-10-03T07:24:51.027 に答える