6

我能够与 PLC 建立连接以从中读取数据。现在有一个问题,我必须编写一种方法来修改来自 PLC 的数据。为此,我必须向 PLC 发送两个值:一个 int 值和一个 boolean 值。我通过 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 中的两种方法:

    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 值表示的寄存器的第二位,则必须执行以下操作:

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

第二行修改了我想在我的 PLC 中写入的位。

于 2012-10-03T07:24:51.027 回答