研究一覧arrow
CODESYSでのPython Scriptingの使い方

CODESYSでのPython Scriptingの使い方

CODESYS では Python スクリプトを活用することで、プロジェクトの自動化や解析を行うことが可能です。本記事では、初心者向けに Python スクリプトの基本的な実行方法と、具体的なサンプルプログラムを紹介します。

Python スクリプトの実行方法

1. CODESYS の GUI から実行する方法

CODESYS では、Python スクリプトを GUI から簡単に実行できます。

  1. VSCode などのエディタで Python スクリプト (.py ファイル) を作成。
  2. CODESYS を開き、Tools -> Scripting -> Execute Script File を選択。
  3. 実行したい .py ファイルを選択。
  4. スクリプトが実行される。

2. コマンドラインから実行する方法

Python スクリプトは CODESYS のコマンドラインからも実行可能です。以下の手順で実行できます。

  1. cmd (コマンドプロンプト) または PowerShell を開く。
  2. 以下のコマンドを入力してスクリプトを実行。
"C:\Program Files\CODESYS 3.5.xx.xx\CODESYS\Common\CODESYS.exe" --profile="CODESYS V3.5 SPxx Patch x" --runscript="C:\path\to\script.py" --noUI

Python スクリプトでできること

CODESYS の Python Scripting では、以下のような操作が可能です。

  • プロジェクトの作成・開閉
  • デバイスの追加・設定変更
  • 変数やプログラムの生成・編集
  • コードのエクスポート・インポート
  • プロジェクトのビルド・コンパイルの自動化
  • CI/CD の自動化
  • ユニットテストや統合テストの実行

Python スクリプトで使用できる API は公式ドキュメントで確認できます。

📄 CODESYS Scripting API ドキュメント

注意点

CODESYS で使用される Python のバージョンは 2.7.12 であり、Python 3系ではなく 2系の書き方をする必要があります。

Python のバージョンを確認するには、以下のスクリプトを実行してください。

import sys
print(sys.version_info)



実行結果

sys.version_info(major=2, minor=7, micro=12, releaselevel='final', serial=0)

スクリプト実行に必要な設定

CODESYS のスクリプトライブラリは scriptengine に含まれており、以下のパスに格納されています。

C:\Program Files\CODESYS 3.5.xx.xx\CODESYS\ScriptLib\Stubs\scriptengine

スクリプトを実行する際には、適宜スクリプトを実行ディレクトリにコピーなどしてもらう必要があります。

簡単なスクリプト例

1. "Hello" を出力する

まずは簡単なスクリプトを実行して、CODESYS の Python スクリプティングが動作することを確認します

print "hello codesys"

2. プロジェクトファイルを開く

次に、CODESYS のプロジェクトファイル (.project) を開くスクリプトを実行します。日本語が含まれたパスを開くときにはutf-8を指定してあげないと正しく認識できないので注意が必要です。

#!/usr/bin/env python
# -*- coding:utf-8 -*-

from scriptengine import *
proj = projects.open("C:\\path\\to\\project")



このスクリプトを実行すると、指定した CODESYS プロジェクトが開かれます。

サンプルスクリプト: ST コードをエクスポートする

サンプルとして現在開いているプロジェクトのSTコードをテキストファイルに出力する例を示します。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import os
from scriptengine import *

def export_st_recursive(obj, base_path):
    """再帰的にオブジェクトを探索し、STコードをエクスポートする"""
    try:
        current_path = base_path
        obj_name = obj.get_name() if hasattr(obj, "get_name") else "unknown"
        print("Processing: " + obj_name)

        if hasattr(obj, "is_folder") and obj.is_folder:
            folder_path = os.path.join(current_path, obj_name)
            if not os.path.exists(folder_path):
                os.makedirs(folder_path)
            for child in obj.get_children():
                export_st_recursive(child, folder_path)
        else:
            has_content = False
            filename = os.path.join(current_path, obj_name + ".st")
            if hasattr(obj, "has_textual_declaration") and obj.has_textual_declaration:
                with open(filename, "w", encoding='utf-8') as f:
                    f.write(obj.textual_declaration.text)
                has_content = True
            if hasattr(obj, "has_textual_implementation") and obj.has_textual_implementation:
                with open(filename, "a" if has_content else "w", encoding='utf-8') as f:
                    f.write("\n\n" + obj.textual_implementation.text)
                has_content = True
            if has_content:
                print("Exported: " + filename)
            if hasattr(obj, "get_children"):
                for child in obj.get_children():
                    export_st_recursive(child, base_path)
    except Exception as e:
        print("オブジェクト処理中にエラーが発生しました: " + str(e))

def export_st_code(base_path):
    try:
        prj = projects.primary
        device = next((obj for obj in prj.get_children() if obj.get_name() == "Device"), None)
        plc_logic = next((obj for obj in device.get_children() if obj.get_name() == "Plc Logic"), None)
        application = next((obj for obj in plc_logic.get_children() if obj.get_name() == "Application"), None)
        if application is None:
            print("Applicationオブジェクトが見つかりませんでした")
            return
        for obj in application.get_children():
            export_st_recursive(obj, base_path)
        print("Export completed successfully")
    except Exception as e:
        print("エラーが発生しました: " + str(e))

if __name__ == "__main__":
    export_path = "C:\\path\\to\\export"
    export_st_code(export_path)
    



このスクリプトを実行すると、CODESYS プロジェクト内の ST コードが指定したディレクトリにエクスポートされます。

参考情報

📄 Unveiling the Power of CODESYS Scripting

CODESYS の Python スクリプティングを活用することで、プロジェクトの効率的な管理や自動化が可能になります。この記事が、スクリプト活用の第一歩として役立てば幸いです!

No items found.

MAZINでは製造DXに取り組む生産技術者を募集しています

私たちと一緒に、新しい技術で製造業の新たな可能性を切り拓きませんか?詳細は以下のリンクをご覧ください。