الدروس

كيفية أتمتة TIA Portal باستخدام Openness API

الدليل النهائي لتحويل سير عمل هندسة Siemens الخاص بك إلى خط أنابيب DevOps حديث.

T
فريق T-IA Connect
15 دقيقة للقراءة
تم التحديث في 10 مارس 2026

لماذا الأتمتة حتمية

الهندسة اليدوية في TIA Portal بطيئة وعرضة للأخطاء. النقر بزر الماوس الأيمن، إنشاء الكتل، نسخ ولصق الكود... يجب أن تختفي هذه المهام المتكررة. بفضل Openness API (وغلاف T-IA Connect REST الخاص به)، يمكنك قيادة TIA Portal مثل أي برنامج حديث.

المتطلبات الأساسية

  • تثبيت TIA Portal V16 أو V17 أو V18 أو V19 أو V21
  • ترخيص T-IA Connect (أو نسخة Freemium)
  • PowerShell أو Python مثبت على جهازك

الخطوة 1: بدء تشغيل REST API

بدلاً من تشغيل TIA Portal يدويًا، سنبدأ تشغيل خادم T-IA Connect الذي سيعمل كبوابة. افتح المحطة الطرفية وقم بتشغيل:

PowerShell
./TiaPortalApi.App.exe --headless

الخطوة 2: فحص الصحة

قبل كل شيء، دعنا نتحقق من أن واجهة API تعمل وأي إصدارات من TIA Portal متاحة.

curl
curl http://localhost:9000/api/health

curl http://localhost:9000/api/health/versions
Response
{
  "status": "healthy",
  "tiaPortalConnected": true,
  "uptime": "00:01:23"
}

{
  "installedVersions": ["V17", "V18", "V19"]
}

الخطوة 3: إنشاء مشروع

لا مزيد من قوائم 'ملف > جديد'. لنرسل طلب POST لإنشاء مشروع فارغ.

curl — POST /api/projects/actions/create
curl -X POST http://localhost:9000/api/projects/actions/create \
  -H "Content-Type: application/json" \
  -d '{
    "name": "MyAutomatedProject",
    "path": "C:\\TIA_Projects",
    "version": "V19"
  }'
Response
{
  "name": "MyAutomatedProject",
  "path": "C:\\TIA_Projects\\MyAutomatedProject",
  "version": "V19",
  "created": true
}

الخطوة 4: إضافة PLC وإنشاء FB

ابحث عن CPU في كتالوج الأجهزة، أضفه للمشروع وأنشئ Function Block بكود SCL — كل ذلك في بضع استدعاءات API.

curl — Search catalog + Add device
# Search the hardware catalog
curl -X POST http://localhost:9000/api/catalog/actions/search \
  -H "Content-Type: application/json" \
  -d '{ "searchPattern": "CPU 1511" }'

# Add the device to the project
curl -X POST http://localhost:9000/api/projects/devices/actions/add \
  -H "Content-Type: application/json" \
  -d '{
    "name": "PLC_1",
    "typeId": "<typeId from search>",
    "deviceName": "CPU 1511C-1 PN"
  }'

# Create a Function Block
curl -X POST http://localhost:9000/api/devices/PLC_1/blocks \
  -H "Content-Type: application/json" \
  -d '{
    "name": "FB_MotorControl",
    "type": "FB",
    "programmingLanguage": "SCL"
  }'

# Add SCL code to the block
curl -X POST http://localhost:9000/api/devices/PLC_1/blocks/FB_MotorControl/networks \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Motor control logic",
    "code": "#Running := #Start AND NOT #Stop;\nIF #Running THEN\n  #Speed := #SpeedSetpoint;\nEND_IF;"
  }'
Response
// Block creation response
{
  "name": "FB_MotorControl",
  "type": "FB",
  "programmingLanguage": "SCL",
  "number": 1
}

// Network added
{
  "networkId": 1,
  "title": "Motor control logic",
  "created": true
}

الخطوة 5: إنشاء العلامات

استيراد علامات PLC (المدخلات والمخرجات والذاكرة) بشكل جماعي عبر استدعاء API واحد.

curl — POST /api/devices/PLC_1/tags/actions/import
curl -X POST http://localhost:9000/api/devices/PLC_1/tags/actions/import \
  -H "Content-Type: application/json" \
  -d '{
    "tagTable": "Motors",
    "tags": [
      { "name": "Motor1_Start",   "dataType": "Bool", "address": "%I0.0" },
      { "name": "Motor1_Stop",    "dataType": "Bool", "address": "%I0.1" },
      { "name": "Motor1_Running", "dataType": "Bool", "address": "%Q0.0" },
      { "name": "Motor1_Speed",   "dataType": "Real", "address": "%QD4"  },
      { "name": "Motor1_Fault",   "dataType": "Bool", "address": "%Q0.1" }
    ]
  }'
Response
{
  "tagTable": "Motors",
  "importedCount": 5,
  "tags": [
    { "name": "Motor1_Start",   "dataType": "Bool", "address": "%I0.0" },
    { "name": "Motor1_Stop",    "dataType": "Bool", "address": "%I0.1" },
    { "name": "Motor1_Running", "dataType": "Bool", "address": "%Q0.0" },
    { "name": "Motor1_Speed",   "dataType": "Real", "address": "%QD4"  },
    { "name": "Motor1_Fault",   "dataType": "Bool", "address": "%Q0.1" }
  ]
}

الخطوة 6: تجميع المشروع

أطلق عملية التجميع وتابع تقدمها عبر واجهة Jobs API. يتم التجميع بشكل غير متزامن.

curl — Compile + Poll job
# Start compilation
curl -X POST http://localhost:9000/api/devices/PLC_1/actions/compile

# Poll the job status (replace <jobId>)
curl http://localhost:9000/api/jobs/<jobId>
Response
// Compilation started
{ "jobId": "c7f3a1b2-...", "status": "running" }

// Job completed
{
  "jobId": "c7f3a1b2-...",
  "status": "completed",
  "errors": [],
  "warnings": 2
}

الخطوة 7: التصدير إلى XML

صدّر الكتل بتنسيق SimaticML (XML) للتحكم في الإصدارات مع Git.

curl — POST /api/devices/PLC_1/blocks/actions/export
curl -X POST http://localhost:9000/api/devices/PLC_1/blocks/actions/export \
  -H "Content-Type: application/json" \
  -d '{
    "blocks": ["FB_MotorControl"],
    "exportPath": "C:\\TIA_Projects\\Export"
  }'
Response
{
  "exportedCount": 1,
  "exportPath": "C:\\TIA_Projects\\Export",
  "files": ["FB_MotorControl.xml"]
}

الخطوة 8: الحفظ والإغلاق

احفظ المشروع وأغلقه بشكل صحيح. مثيل TIA Portal جاهز للتشغيل الآلي التالي.

curl — Save & Close
curl -X POST http://localhost:9000/api/projects/actions/save

curl -X POST http://localhost:9000/api/projects/actions/close
Response
{ "saved": true }

{ "closed": true }

ماذا بعد؟

لقد قمت للتو بأتمتة 90% من مهام إنشاء المشروع اليدوية. يمكنك الآن دمج هذا البرنامج النصي في خط أنابيب CI/CD (Jenkins, GitLab CI) للتحقق من الكود الخاص بك في كل التزام.

قم بتنزيل السكريبتات الكاملة لهذا البرنامج التعليمي وجربها مع نسخة Freemium الخاصة بنا.