ネイティブ関数ブロックでのカスタム配列の定義 – 実践ガイド
この投稿をする理由
実際、この投稿は、ネイティブ関数ブロックを開発していたときに、カスタム構造の配列を使用できないことがわかったために作成されました。別の言い方をすると、PLCnext の公式 GitHub にこの種のチュートリアルがないのが残念です。 C# チュートリアルを使用してネイティブ関数ブロックでカスタム配列を作成すると、正常にコンパイルできないか、PLCnext Engineer で配列値を設定しても応答がないことがわかります。このケースの例はたまたまデータベースに関連しているだけです。
デモの説明
- 次の例では、ネイティブ関数ブロックを使用して、PLCncli ツールチェーンでユーザー定義の配列インターフェイスを作成します
- 配列は 21 個の要素で構成され、それぞれが構造体です。次の図に示すように、この構造には 2 つの IecString80 と 1 つの列挙が含まれています。
https://github.com/Leeable/UserDefineArray_NativeFB/tree/Master
要件
- ToolChain のバージョンが 23.0 以降であることを確認してください。この例では、デモンストレーションの目的で 23.6 ToolChain を使用します。
- ネイティブ関数ブロックを確立する基本プロセスに精通していること
- ToolChain アドイン プラグインを備えた Visual Studio 2019 または 2022
$ plcncli --version
plcncli 23.6.0.1450 (23.6.0.1450)
ステップ1
- Visual Studio を使用して新しいプロジェクトを作成し、プロジェクト タイプとして「Shared Native Function Block」を選択し、プロジェクトに「ArrayTest」という名前を付けます。
- 次に、Visual Studio の ArrayTest プロジェクト内で、「ArrayCplus」という名前の新しいネイティブ関数ブロックを作成します。
ステップ2
-
これらのコードを ArrayCplus.cs にコピーします
-
ここにソース コード (&や> など) を直接含めると表示上の問題が発生するため、代わりにリンクを提供しました。
-
たとえば、&は
&としてエンコードされます。 この HTML では....
ArrayCplus.cs
ステップ3
ArrayTestCpp フォルダー内のターミナルを開き、次のように入力します。
$ plcncli generate code
コードを生成したら、ArrayTest-cli32.h を見つけます。 およびArrayTest-cli64.h src ディレクトリ内のファイルを検索し、#error が示されている場所を見つけます。
コメントを削除してコードを改善する必要があります。クリックして InArrayFB-cli.cpp に移動します。 実装を変更します。
IntArrayFB-cli.cpp
ステップ4
ArrayCplus.cpp内 、次のコードを入力します。文字列を含むコンテンツは、Init 領域ではなくプロセス内で初期化する必要があります。 Init 領域での初期化は機能せず、その結果、Engineer を通じて sName と sAttribute に値を書き込むことができなくなります。
ArrayCplus-cli.cpp
ステップ5
ArrayTestCpp フォルダー内のターミナルを開き、次のように入力します。
$ plcncli build all
$ plcncli deploy
ステップ6
PLCnext Engineer を開き、ArrayTest.pcwlx をロードします。 arr
という名前の変数を ArrayTest に追加します。これで動作できるようになりました
質問
- このメソッドは実際には機能しますが、void PInvoke ArrayTest::ArrayCplus::Process() で IecString またはユーザー定義文字列を含むコンテンツを初期化する必要があるのはなぜですか? void PInvoke ArrayTest::ArrayCplus::Init() の代わりに ?コードをvoid PInvoke ArrayTest::ArrayCplus::Init()に入れても機能しません。 .
- GitHub にはネイティブ関数ブロックのユーザー定義配列に関する対応するチュートリアルがないことは明らかです。誰か補足して改善してもらえませんか? (Csharp Userdefine 配列がネイティブ関数ブロックで動作しない方法)
- 最後に私を混乱させた点は、IecString、ユーザー定義文字列、IecStringEx* のいずれであっても、文字列が含まれる場合、なぜ【InOut】の形式でなければならないのかということです。 ]ネイティブ関数ブロックとして使用される場合、CSharp コード内で使用されますか?
注:
Makers Blog には、フエニックス・コンタクトによってテストまたはレビューされていないアプリケーションとコミュニティ メンバーのユーザー ストーリーが表示されます。ご自身の責任で使用してください。
産業技術