November 17, 2020

Переменная через указатель, через ADS

Значение переменной можно прочитать через указатель по ADS.

PROGRAM MAIN
VAR
    state:  UINT;
    pState: POINTER TO UINT;
END_VAR

pState := ADR(state);


Прочитаем значение переменной `state` через ее указатель `pState`. Нужно разыменовать указатель, добавив спец. символ `^` к имени указателя. Получим `pState^`. Программа на C# для текущей версии 4.4.10 библиотеки Beckhoff.TwinCAT.Ads:

ushort state = (ushort) tcAdsClient.ReadSymbol( "MAIN.pState^", typeof( ushort ), false );


Значение переменной читается. Теперь возьмем пробную версию новой библиотеки 5.0.1-preview.12 под .NET Core 3.1.0. Код поподробнее:


Программа читает переменную и в зависимости от ее значения рисует замысловатые узоры. Имея указатель можно вытягивать значение переменной. Это полезное свойство и дополнительные телодвижения здесь не нужны.


Для новой библиотеки под .NET Core требуется создать файл роутинга `StaticRoutes.xml`. В этом файле настраиваются соединения между целевым контроллером и ПК. Если контроллер  и ПК находятся на одной и той же машине, то настраивать этот файл не нужно. Можно просто удалить его.

3 comments

  1. Great tip, thanks! It seemed to work well with REFERENCE too.

    Few days ago I managed to do a temporary hack to read some values from the PLC and they were available only as references. Without this blog post I would have though that it couldn't be done.

    ReplyDelete
    Replies
    1. By the way: I used CreateVariableHandle method

      Delete
    2. Hi Jussi. Great to hear from you again. REFERENCEs is some sort of POINTERS but I was also surprised that this is working. Thought it is a good idea to check some other ways sort of .ReadSymbol or .CreateVariableHandle. Thanks that you have already done this.

      Delete

Note: Only a member of this blog may post a comment.