私たちの目標:このライブラリは、独自のPLCを構築できるよう設計されています。Fulmatic SOFTでプログラミング可能なデバイスのエコシステムを構築し、ハードウェアを最大限に制御できるようにすることを目指しています。この包括的なライブラリは、お好みのチップとIDEで使用できます。回路図やその他のハードウェア仕様はすべてご自身で定義できます。
Fulmatic SOFT:指示に従って Fulmatic Core ライブラリをチップ コードに追加すると、Fulmatic SOFTを使用してラダー( IEC 61131-3 ) 言語で組み込みシステムをプログラミングできるようになります。Fulmatic SOFT は、最新の PLC のすべての機能に加え、TCP、UDP、モーション、SD カード コマンドを備え、単なる PLC 以上の機能を提供します。Fulmatic SOFT は、771 ブロック (255 DB、256 PB、256 FB、4 OB) と 16384 IO を備えた広大なワークスペースを提供します。
無料PLCファームウェア:PLCライブラリは最大2048バイト(DB0で1026バイト使用)まで無料でご利用いただけます。それ以上のメモリが必要な場合は、ライセンス(10米ドル)をご購入ください。ライセンスがない場合、PLCは60分間動作します。当社の透明性の高いライセンスモデルには、契約や複雑なプロセスはありません。回路にTSHA204A-SSHDAチップを追加する必要があります。ライセンスを購入すると、キーが発行されます。ライセンスアプリケーションはこのキーを使用して当社のサーバーに接続し、シリアルポートまたはイーサネット経由でライセンスコードをチップにアップロードします。サーバー上のライセンス数は同時に減少します。
GitHub: VS Codeで作成したSTM32F407VGTx用のサンプルプロジェクトをGitHubからダウンロードして、PLCライブラリをテストできます。https ://github.com/FultekPLC/Plc-Firmware
このプロジェクトでは、チップのほぼすべての機能を活用した完全なPLCファームウェアをオープンソースとして提供しています。Cube MXソフトウェアを使用してチップのハードウェア仕様を変更し、同じプロジェクトで作業を続けることができます。また、VS Codeを使用してハードウェア仕様とソフトウェアを変更することも可能です。PLCファームウェアにカスタム関数を追加し、PLCコード内から実行することもできます。任意のブランドとモデルのARMチップを使用し、IOの数と種類を指定できます。つまり、ライセンス条項に従って、Fulmatic Coreライブラリを制限なく使用できます。
ファームウェアアップデート:お客様は、Fulmatic SOFTを使用してPLCファームウェアのアップデートを実行できます。PLCファームウェアアップデートコードは完全にオープンソースであり、サンプルプロジェクトのブートローダーコードを確認および変更できます。推奨コード以外にも、独自のブートローダーコードを作成することも可能です。



コードガイド
256KBのサンプルプロジェクトを使いやすくするために取り組んでいます。チップ用の256KBのコードはかなり大きなプロジェクトです。この規模のプロジェクトを理解し、変更し、実装するのは容易ではありません。このページとコード内で関数の説明を試みました。さらに、より分かりやすく説明できるよう努めています。GitHubリポジトリのディスカッションセクションで、できる限り皆様からのご質問にお答えします。残念ながら、Fulmatic Coreの無料サポートは提供しておりません。回路基板設計を含むすべてのプロセスを弊社が代行するお見積もりをご希望の場合は、お問い合わせください。
サンプルプロジェクトは、GitHubのリンク(https://github.com/FultekPLC/Plc-Firmware )からダウンロードできます。サンプルプロジェクトでは、オープンソースコードを使用してPLCのすべての機能を確認および変更できます。不要な機能を削除したり、新しい機能を追加したりできます。
IDEやビルドツールに関するすべての情報は、当社のGitHubリポジトリにあります。このページでは、ライブラリをMCUコードに統合するために使用される機能について説明します。
FulmaticConfig.h
ファームウェアのバージョンと文字列サイズの定義は、このファイルで行われます。
FulmaticCore.h
このファイルには、MCUコードから呼び出すライブラリ内の関数のヘッダーが含まれています。このファイルには、すべての関数の説明が記載されています。ライブラリは多くの変数と文字列を扱います。これらの文字列と変数は、MCUコード内で作成する必要があります。`variables_TypeDef`構造体は、作成した変数をライブラリに渡すために使用されます。この構造体は変更できません。
FulmaticInit:このコマンドは、チップの電源を初めてオンにしたときに一度だけ実行すれば十分です。戻り値が1であれば、ライセンスチップが正しく読み取られ、ライセンスに基づいて動作していることを示します。
FulmaticExecuteは、main.c内で呼び出され、 PLCラダーコードを実行する関数です。この関数は、スタートアップブロック(PLCの起動時)、メインブロック(各サイクル時)、シャットダウンブロック(PLCの停止時)、Interrput.c内でデジタル入力割り込みが発生した時、およびFulmatic.c内で時間ベース(タイマー)割り込みが発生した時に呼び出されます。
フルマティック.c
ライブラリをコードで使用するために必要なすべての関数は、Fulmatic.c ファイルにまとめられています。このファイルから他のファイルに分岐しています。関数は4つのカテゴリに分類されています。関数の説明は、関数本体が記述されているファイルに記述されています。
- サンプルプロジェクトに必要な関数のうち、ライブラリでは使用されていない関数。
- ライブラリで使用される関数で、コードに含める必要があるもの。
- ライブラリがライセンス目的で使用する関数。ライセンスなしでの使用には不要な関数。
- ライブラリの機能は、使用するPLCコマンドに依存します。例えば、TCP、UDP、SPI、シリアルポート、SDカードなどの操作がPLCで使用されていない場合、ライブラリはこれらの機能なしで動作します。
_DefaultEprom: Fulmatic SOFTで選択可能なハードウェア設定は、PlcSetupEprom[STPMEMORYSIZE]配列とラダーコード配列PlcEprom[PRGMEMORYSIZE]に格納されます。このファイル内の_DefaultEprom関数には、PLCのデフォルト設定が含まれています。これらの配列をコードで使用することで、設定をある程度カスタマイズできます。
`_EachMilliSecond`:この関数は1ミリ秒ごとに実行され、メインファイルとライブラリ内から実行されます。サンプルプロジェクトでは、フラグは直接実行されるのではなく、`Interrupt.c` の `TIM7_IRQHandler` を使用して設定されます。さらに、`TIM7->ARR` の値は RTC で較正されます。`Fulmatic.c` の `_RtcCalibration` 関数を確認してください。較正が正しくないと、PLC のすべての時間ベースの操作が軽微なエラーで実行されます。
_DelayUs:チップの周波数に合わせて正確に設定するために、コードを修正する必要がある場合があります。長期間にわたってテストとキャリブレーションを行う必要があります。168 MHz 用にキャリブレーションされています。
_SetOutputs:通常、入力はmain.c内で読み取られ、出力はmain.c内で書き込まれます。しかし、時間ベースまたはデジタル入力の割り込みが発生すると、OB2割り込みブロックがトリガーされます。その後、ライブラリ内からこのブロックが呼び出され、出力が遅延なく設定されます。
_GetMsTimerCount :多くの操作における所要時間の計測に使用されます。コード内に必ず記述する必要があります。ミリ秒単位のタイマー値の読み取りを有効にする必要があります。
_CrcCalculate:ハードウェアを使用してチェックサムを計算するために使用されます。使用するチップに応じて正しく動作することを確認する必要があります。
コミュニケーション.c
このファイルには、PLC内でイーサネット、シリアルポート、SPIを使用するために必要なコードが含まれています。ModbusおよびFulmatic SOFTからの呼び出しは、このファイルで受信されます。main.cから遅延を設けて応答を開始することで、データの一貫性が確保されます。さらに、ファームウェアの更新とSDカードのコードもこのファイルに明示的に記述されています。Fulmatic SOFTはこのコードを使用してファームウェアの更新とSDカードの操作を実行します。このコードを変更することで、Fulmatic SOFTの代わりに独自のソフトウェアで同様の操作を実行できます。その他のFulmatic SOFT操作とModbus操作は、このコードを介してライブラリに送信され、ライブラリによって応答されます。コードを変更することで、ライブラリに送信せずにModbus呼び出しに応答することもできます。
Flash.c
PLCの電源がオフになると、PLCコードと永続タイマーカウンタ情報がフラッシュメモリに保存されます。PLCの電源が再びオンになると、最後に保存されたコードがflash.hファイルから読み込まれます。使用するチップのセクタ情報を設定することを忘れないでください。PLCの電源がオフになったことを検出するには、以下の回路を使用できます。

この回路は、電圧が24ボルトから約19ボルトに低下すると、シャットダウン検出ピンをローに設定します。コンデンサC1により、チップは短時間動作を継続できます。この長時間の間、フラッシュメモリの消去と書き換えは危険です。したがって、以下の手順に従う必要があります。
- PLCの電源投入時に、セクター10の内容をセクター11にコピーします。起動中に電源が遮断された場合、データはセクター11にそのまま保存されます。
- フラッシュメモリに新しいデータを保存するには、まず既存のデータを削除する必要があります。削除には保存よりもはるかに時間がかかります。そのため、起動時にセクター10を削除し、シャットダウンを待ちます。
- シャットダウン検出回路は、1秒強の時間を提供します。シャットダウンが検出されると、データは100~200ミリ秒以内にセクター10に保存されます。OB 1シャットダウンブロックはシャットダウン前に実行され、PLCには大きなラダーコードが含まれている可能性があるため、C1コンデンサは少なくとも2200μFである必要があります。大きな容量による回路への衝撃を防ぐために、100Ωの電流制限抵抗が使用されます。
- PLCが起動すると、セクター10のすべてのデータを読み込み、チェックサムチェックを実行します。PLCの起動中に電源が遮断されると、チェックサムチェックは失敗します。しかし、セクター11には常に信頼できるデータが格納されているので、慌てる必要はありません。起動はセクター11から自動的に行われます。
Interrupt.c
デジタル入力、ADC、タイマー、およびUART割り込みは、このファイルにあります。これらは、Fulmatic.c内の_INTSetup関数で、PLCの動作モードに応じて有効/無効にされます。_INTSetupコードは、ご使用のハードウェアに合わせて調整してください。このファイル内の関数は高速に実行される必要があります。サンプルコードでは、コードの可読性を向上させるためにswitchコマンドを使用しましたが、実行速度を上げる方法もあります。たとえば、switchコマンド内の操作を個別の関数として記述することができます。
- void Handle_Encoder(void)
- void (*EXTI0_Handler_Ptr)(void);
- INTSetupでFulmatic SOFTを使用して選択した内容に応じて、EXTI0_Handler_Ptr = Handle_Encoder;
- 割り込みが発生した場合:EXTI0_IRQHandler 内で EXTI0_Handler_Ptr() を実行します。
もう1つの高速化方法は、バイトから32ビットへの変換です。STMシリーズでは、次のコードを使用できます。*(int32_t *)&PlcIO[EncIAdr[0]] = __rev(ValueS32);
割り込みフラグをクリアするためにHALライブラリを使用すべきではありません。代わりに、レジスタ値を直接変更するより高速な方法を使用することをお勧めします。TIM3->SR = 0; //__HAL_TIM_CLEAR_IT(htim, TIM_IT_UPDATE);
デジタル入力割り込み:高速カウンタ、エンコーダ、および同様のアプリケーションで使用されます。
ADC: DMAは使用せず、割り込み処理内でADC読み出し操作を実行します。これにより、フィルタリング処理が可能になります。
タイマー:これは1ミリ秒タイマーとPTO出力に使用します。タイマーは1ミリ秒ごとに割り込みを発生させるだけでは不十分で、0から999までカウントする必要があります。
USART:シリアルポートの割り込みは、データの送受信に使用されます。さらに、Fulmatic.c -> _EachMilliSecond には、RS485 イネーブルピンの操作が含まれています。
SdCard.c
SDカードの操作はこのファイルで行います。サンプルプロジェクトとは異なる方法で実行することも可能です。PLCへのファイルのアップロードまたはダウンロードを行うための通信コードは、Communication.c内にオープンソースで記述されています。Fulmatic SOFTを使用してファイルのアップロードとダウンロードを行うことができます。プロジェクトにSDカードがない場合は、すべての機能を削除できます。
main.c
このファイルは、Cube MX でプロジェクトを保存するたびに変更されます。コマンドが変更されないようにするには、Cube MX のコード用に予約された領域にコードを記述する必要があります。 /* USER CODE BEGIN 2 */ ここにコードを記述してください。 /* USER CODE END 2 */
このファイル内で、ライブラリに必要なすべての変数を作成できます。特定のアドレスに大きな配列を作成する必要がある場合があります。`uint8_t PlcEprom[PRGMEMORYSIZE] __attribute__((section(“.ccmram”))));`
whileループ内の処理を注意深く確認してください。変更を加える際は、全体の構造を損なわないようにしてください。プログラムの他の部分に記述されたコードによって、このループの処理速度が低下しないようにしてください。
