#Siemens Openness とは?
TIA Portal OpennessはSiemens社から提供したエンジニアリンクオーブンインタフェースです。このインタフェースを使うによってTIA Portal(Siemens社のエンジニアリンクツール)を外部アプリケーションから制御することも可能になります。
TIA Portal Opennessを使えば、こんなことができるようになります.
- プロジェクト作成
- プロジェクト修正
- プロジェクト削除
- プロジェクトデータを読む
- プロジェクトデータをほかのアプリケーションを操作する
イメージがあまり浮いていませんが、下図のように表示するといかがでしょう?XMLFilesがありまして、中に作成したいDevicesなどを記入されています。そしてTIA Openness Projectがありまして、パソコンに入ってるTIA PortalのDevices追加、Connection作成などの動作はそのTIA Openness Project経由しXMLをImportし操作を行う。
#紹介
- TIA Portal Openness: Introduction and Demo Application
- Basic example on how to use openness with Python using Pythonnet
- Advantages & Disadvantages of Siemens' TIA Openness
##ビデオ
- TIA Portal Openness - Generation of multiple customised projects, at the same time!
- TIA Portal Openness - Automatic project generation
- Openness - Efficient generation of program code using code generators
##Manual
- SIMATIC Openness: Automating creation of projects
- TIA Portal Openness: Generating a Modular Machine with S7-1500
##作業環境
- Python 3.7.1
- pythonnet
- Jupyter
##インストールするときの不明点
##プログラミングステップ
- TIA PortalをOpennessに連携できる環境を作る
- TIA Portalをアクセスのプログラム作る
- TIA PortalをアクセスのプログラムActivateし、TIA Portalをアクセスする
- TIA Portal起動する
- Projectを開く
- さまざまなコマンドを実行する
- Projectを保存・閉じる
- TIA Portalの間のアクセスを切断する
##TIA Portal Openness Object Model
以下の図はObject Modelについて説明します。TIA PortalにF1を押しOpennessを検索すれば同じなものもでてきます。
###Highest Level
###GlobalLibrary
###ProjectLibrary
###HmiTarget
###PlcSoftware
本来ならC# でプログラミングしないといけないですが、ここでpythonnetを使ってOpennessのdllを読み込んでPythonでやりたいと思います。
#実装
##プロジェクト作成
以下はProject_testというProjectをC:\tiav15_1_projectに作ることができます。
(もし同じ名前のプロジェクトも既にあるだと例外が発生します。)
import clr
clr.AddReference('C:\\Program Files\\Siemens\\Automation\\Portal V15_1\PublicAPI\\V15.1\\Siemens.Engineering.dll')
from System.IO import DirectoryInfo,FileInfo
import Siemens.Engineering as tia
import Siemens.Engineering.HW.Features as hwf
project_path = DirectoryInfo ('C:\\tiav15_1_project')
project_name = 'Project_test'
print ('Starting TIA with UI')
mytia = tia.TiaPortal(tia.TiaPortalMode.WithUserInterface)
myproject = mytia .Projects.Create(project_path, project_name)
##プロジェクト開く
以下はプロジェクトを開くのコードです。
(もし該当プロジェクト既に開いてるのあれば例外が発生します。)
import clr
clr.AddReference('C:\\Program Files\\Siemens\\Automation\\Portal V15_1\PublicAPI\\V15.1\\Siemens.Engineering.dll')
from System.IO import DirectoryInfo,FileInfo
import Siemens.Engineering as tia
import Siemens.Engineering.HW.Features as hwf
def openTIAProject(tia,open_path):
try:
project=tia.Projects.Open(open_path)
return project
except Exception as e:
print(e)
return None
open_path=FileInfo('C:\\tiav15_1_project\\project\\porject\\AppTest\\AppTest.ap15_1')
print ('Starting TIA with UI')
mytia = tia.TiaPortal(tia.TiaPortalMode.WithUserInterface)
myproject=openTIAProject(mytia,open_path)
##プロジェクトを閉じる
myproject.Close()
##プロジェクトを保存
myproject.Save()
##プロジェクトの情報もらう
print('Project Information\n'
'-Name:{}\n'
'-Author:{}\n'
'-Comment:{}\n'
'-Copy Right:{}\n'
'-Creation time:{}\n'
'-Family:{}\n'\
'-IsModified:{}\n'
'-Language Settings:{}\n'
'-Last Modified:{}\n'
'-Last Modified By:{}\n'
'-Name:{}\n'
'-Path:{}\n'
'-Size:{}\n'
'-Version:{}\n'
.format(
myproject.Name
,myproject.Author
,myproject.Comment
,myproject.Copyright
,myproject.CreationTime
,myproject.Family
,myproject.IsModified
,myproject.LanguageSettings
,myproject.LastModified
,myproject.LastModifiedBy
,myproject.Name
,myproject.Path
,myproject.Size
,myproject.Version
))
##Device操作
基本的にはデバイスのOrder Numberを参照してやります。(たまに新し過ぎるものが追加でません…)
デバイスのOrder Number常に見えるようにする設定:
そのCheckBox入れると、Hardware Catalogの表示はこんな風に変わります:
###Device追加
import clr
clr.AddReference('C:\\Program Files\\Siemens\\Automation\\Portal V15_1\PublicAPI\\V15.1\\Siemens.Engineering.dll')
from System.IO import DirectoryInfo,FileInfo
import Siemens.Engineering as tia
import Siemens.Engineering.HW.Features as hwf
project_path = DirectoryInfo ('C:\\tiav15_1_project')
project_name = 'Project_Demo16'
#Creating new project
print ('Creating project..')
#Starting TIA
print ('Starting TIA with UI')
mytia = tia.TiaPortal(tia.TiaPortalMode.WithUserInterface)
try:
myproject = mytia.Projects.Create(project_path, project_name)
except Exception as e:
print(e)
#Addding Stations
print ('Creating station 1')
station1_mlfb = 'OrderNumber:6ES7 515-2AM01-0AB0/V2.0'
station1 = myproject.Devices.CreateWithItem(station1_mlfb, 'station1', 'station1')
print('Station1 is Created.')
##TIAのViewを変わる
###Topology view
myproject.ShowHwEditor(tia.HW.View.Topology)
###NetworkView
myproject.ShowHwEditor(tia.HW.View.Network)
###Device view
myproject.ShowHwEditor(tia.HW.View.Device)
##Languages
###英語追加
from System.Globalization import CultureInfo
EnlishLanguage=myproject.LanguageSettings.Languages.Find(CultureInfo('en-US'))
Comments=myproject.Comment
CommentsItem=Comments.Items
EnglishComment=CommentsItem.Find(EnlishLanguage)
##SoftwareContainer
PLCを追加したあと、中のBlocks、Tagテーブル操作するにはこのSoftwareContainerが必要です。
ここで仮にPLCが追加済です。
###SoftwareContainerもらう
SoftwareContainer=tia.IEngineeringServiceProvider((myproject.Devices[0].DeviceItems[1])).GetService[hwf.SoftwareContainer]()
software=SoftwareContainer.get_Software()
###Tagテーブル追加
TagTableName='MyTable'
print('Creating PLC Tag Table:'+TagTableName)
TagTableGroup=software.get_TagTableGroup()
TagTable=TagTableGroup.get_TagTables()
TagTable.Create(TagTableName)
plcTable=TagTable.Find(TagTableName)
###PLC Tag追加
tagComposition=plcTable.Tags
Start=10
End=11
print('Start to create IOTags..')
for k in range(Start,End+1):
for i in range(0,8):
dataType='Bool'
tagName='MyTag_'+str(k)+'.'+str(i)
Address='%Q'+str(k)+'.'+str(i)
Comment='My Tag:)! {}'.format(str(k)+'.'+str(i))
print('Creating tag..Name:{},Type:{},Address:{},Comment:{}'.format(tagName,dataType,Address,Comment))
tag1=tagComposition.Create(tagName,dataType,Address)
CommentTag1=tag1.Comment.Items
CcTag1=CommentTag1.Find(EnlishLanguage)
CcTag1.Text=Comment
###プロジェクトコンパイル
import Siemens.Engineering.Compiler as cp
softwareComp=software.GetService[cp.ICompilable]()
softwareComp.Compile()
##BlockとBlockグループ
###Blockグループもらう
BlockGroup=software.BlockGroup
###BlockグループにあるBlock情報もらう
def define_ProgrammingLanguage(ProgrammingLanguage):
if ProgrammingLanguage == 2:
return 'LAD'
elif ProgrammingLanguage == 3:
return 'FBD'
elif ProgrammingLanguage == 1:
return 'STL'
elif ProgrammingLanguage == 4:
return 'SCL'
elif ProgrammingLanguage == 5:
return 'DB'
elif ProgrammingLanguage == 6:
return 'GRAPH'
Groups=BlockGroup.get_Groups()
for bg in Groups:
for b in bg.get_Blocks():
AttributeInfos=b.GetAttributeInfos()
for Attribute in AttributeInfos:
print(Attribute.Name+':'+str(b.GetAttribute(Attribute.Name)))
print('-'*30)
###Blockグループ作成
def CreateBlockGroup(plcsoftware,GroupName):
systemGroup=plcsoftware.BlockGroup
groupComposition=systemGroup.Groups
if software.BlockGroup.Groups.Find(GroupName):
print(GroupName+' is existed. Can not Created..')
else:
createdGroup=groupComposition.Create(GroupName)
CreateBlockGroup(software,'Folder2221')
###Blockグループ探す
Block_autoNumber=Groups.Find('TestGroup').Blocks.Find('Block_1').GetAttribute('AutoNumber')
###Blockグループ削除
def DeleteBlockFolder(plcsoftware,GroupName):
group=plcsoftware.BlockGroup.Groups.Find(GroupName)
if group:
group.Delete()
else:
print(GroupName+' is not existed in your project.')
DeleteBlockFolder(software,'Folder2221')
###Blocksグループを回す
def EnumerateBlockUserGroups(blockUserGroup):
for subBlockUserGroup in blockUserGroup.Groups:
print('|-'+subBlockUserGroup.Name)
def EnumerateAllBlockGroupsAndSubgroups(plcsoftware):
for blockUserGroup in plcsoftware.BlockGroup.Groups:
print(blockUserGroup.Name)
EnumerateBlockUserGroups(blockUserGroup)
EnumerateAllBlockGroupsAndSubgroups(software)
###BlockをExport
from Siemens.Engineering import ExportOptions,ImportOptions
Block_ex=Groups.Find('TestGroup').Blocks.Find('Block_1')
save_path=FileInfo('C:\\Data\\f.xml')
Block_ex.Export(save_path,ExportOptions.WithDefaults)
###BlockをImport
gex=Groups.Find('TestGroup')
bex=gex.Blocks.Import(save_path,ImportOptions.Override)
###Blockをアクセス
def AccessASingleBlock(plcsoftware,blockname):
return plcsoftware.BlockGroup.Blocks.Find(blockname)
block=AccessASingleBlock(software,'Main')
###Blockの設定変更
block=AccessASingleBlock(software,'Block_1')
block.SetAttribute('AutoNumber',False)
block.SetAttribute('Number',999)
###Blockをまわす
def EnumerateAllBlocks(plcsoftware):
for block in software.BlockGroup.Blocks:
print(block.Name)
EnumerateAllBlocks(software)
##PLC操作
###Online
from Siemens.Engineering.Online import OnlineProvider
plc=myproject.Devices[0]
plc1=plc.DeviceItems[1]
plc_online=plc1.GetService[OnlineProvider]()
####Connection interface Configure
for configmode in onlineConfig.Modes:
print('Interface:'+configmode.Name)
for pcInteface in configmode.PcInterfaces:
print('PC Interface Name:'+str(pcInteface.Name))
print('PC Interface Number:'+str(pcInteface.Number))
for tagetInterface in pcInteface.TargetInterfaces:
print('Taget Interface:'+str(tagetInterface.Name))
####Get the Connection By Name
mode=onlineConfig.Modes.Find('PN/IE')
pcInt=mode.PcInterfaces.Find('PLCSIM',1)
slot=pcInt.TargetInterfaces.Find('1 X1')
####access subnets and gateways by their name or IP address
def AccessSubnetAndGatewayOfPCInterface(pcInterface):
subnet=pcInteface.Subnets.Find('PN/IE_1')
print(subnet.Name)
subnetAddress=subnet.Addresses.Find('192.168.0.1')
print(subnetAddress.Name)
gateway=subnet.Gateways.Find('Gateway 1')
print(gateway)
if gateway:
gatewayAddress=gateway.Address.Find('192.168.0.2')
print(gatewayAddress)
AccessSubnetAndGatewayOfPCInterface(pcInt)
###Go Offline/Online
def SetOnlineConnectionForAllPLCs(project,oper):
for device in project.Devices:
for deviceItem in device.DeviceItems:
onlineProvider=deviceItem.GetService[OnlineProvider]()
if onlineProvider:
if oper==1:
onlineProvider.GoOnline()
else:
onlineProvider.GoOffline()
SetOnlineConnectionForAllPLCs(myproject,0)
##Network Connection作成
まず現在の構成:
#get the Devices
plc1=myproject.Devices[0]
v90=myproject.Devices[1]
print(v90.Name)
print(plc1.Name)
###Subnet作る
myproject.Subnets.Create('System:Subnet.Ethernet','NewSubNet2')
###Subnetがあるかを確認
もしなかったらNoneが戻ってきます。
subnet=myproject.Subnets.Find('NewSubNet2')
###SubnetのIPなど変更
#Change IP and Connect to Subnet
n_interfaces=[]
device_item_aggregation =plc1.DeviceItems[1].DeviceItems
device_item=device_item_aggregation[3]
for d in device_item_aggregation:
print(d.Name)
network_service = tia.IEngineeringServiceProvider(device_item).GetService[hwf.NetworkInterface]()
network_service.Nodes[0].SetAttribute('Address','192.168.0.126')
network_service.Nodes[0].ConnectToSubnet(subnet)
n_interfaces.append(network_service)
###IOSytem作る
#Create IO System
ioSystem = n_interfaces[0].IoControllers[0].CreateIoSystem("PNIO");
###接続
#Connect Other Devices
device_item_aggregation1 =v90.DeviceItems[1].DeviceItems
device_item=device_item_aggregation1[0]
print(device_item.Name)
network_service = tia.IEngineeringServiceProvider(device_item).GetService[hwf.NetworkInterface]()
network_service.Nodes[0].SetAttribute('Address','192.168.0.145')
network_service.Nodes[0].ConnectToSubnet(subnet)
n_interfaces.append(network_service)
len(n_interfaces)
n_interfaces[1].IoConnectors[0].ConnectToIoSystem(ioSystem)
##Technology Objects
from Siemens.Engineering.SW.TechnologicalObjects import TechnologicalInstanceDB
from System import Version as vr
###PID_Compact
to11=software.TechnologicalObjectGroup.TechnologicalObjects
toName="PID_Compact_1"
toType='PID_Compact'
version=vr("2.3")
pid_compact=to11.Create(toName,toType,version)
#Config Constant
PID_COMPACT_MODE_INACTIVE=0
PID_COMPACT_MODE_PRETUNING=1
PID_COMPACT_MODE_FINETUNING=2
PID_COMPACT_MODE_AUTO=3
PID_COMPACT_MODE_MANUAL=4
#PhysicalQuantity
PID_COMPACT_PHYSICAL_GENERAL=0
PID_COMPACT_PHYSICAL_TEMPERATURE=1
PID_COMPACT_PHYSICAL_PRESSURE=2
PID_COMPACT_PHYSICAL_LENGTH=3
PID_COMPACT_PHYSICAL_FLOW=4
PID_COMPACT_PHYSICAL_BRIGHTNESS=5
PID_COMPACT_PHYSICAL_LLLUMINANCE=6
PID_COMPACT_PHYSICAL_FORCE=7
PID_COMPACT_PHYSICAL_TORQUE=8
PID_COMPACT_PHYSICAL_MASS=9
PID_COMPACT_PHYSICAL_CURRENT=10
PID_COMPACT_PHYSICAL_VOLTAGE=11
PID_COMPACT_PHYSICAL_POWER=12
PID_COMPACT_PHYSICAL_AREA=13
PID_COMPACT_PHYSICAL_VOLUME=14
PID_COMPACT_PHYSICAL_ANGLE=15
PID_COMPACT_PHYSICAL_VISCOSITY=16
PID_COMPACT_PHYSICAL_SPEED=17
PID_COMPACT_PHYSICAL_VELOCITY=18
PID_COMPACT_PHYSICAL_DENSITY=19
PID_COMPACT_PHYSICAL_FREQUENCY=20
PID_COMPACT_PHYSICAL_ANGULAR_VELOCITY=21
#PhysicalUnit
PID_COMPACT_PHYSICAL_GENERAL_UNIT_PERCENTAGE=0
PID_COMPACT_PHYSICAL_TEMPERATURE_UNIT_C=0
PID_COMPACT_PHYSICAL_TEMPERATURE_F=1
PID_COMPACT_PHYSICAL_TEMPERATURE_K=2
####パラメータ設定
def SetTOParas(to,config,Value):
paras=to.Parameters.Find(config)
print(paras.Name+' is '+str(paras.Value)+'.')
paras.Value=Value
print(paras.Name+'is changed to '+str(paras.Value)+'.')
#Mode
config='Mode'
# paras=pid_compact.Parameters.Find(config)
SetTOParas(pid_compact,config,PID_COMPACT_MODE_MANUAL)
#PhysicalQuantity
config='PhysicalQuantity'
SetTOParas(pid_compact,config,PID_COMPACT_PHYSICAL_TEMPERATURE)
config='PhysicalUnit'
SetTOParas(pid_compact,config,PID_COMPACT_PHYSICAL_TEMPERATURE_F)
#PID values set by user
config='_Retain.CtrlParams.SetByUser'
SetTOParas(pid_compact,config,True)
config='Retain.CtrlParams.Gain'
SetTOParas(pid_compact,config,1.1)
config='Retain.CtrlParams.Ti'
SetTOParas(pid_compact,config,20.1)
config='Retain.CtrlParams.Td'
SetTOParas(pid_compact,config,0.1)
###High_Speed_Counter
to_high_speed_counter=[]
for i in range(2):
toName='High_Speed_Counter_'+str(i)
toType='High_Speed_Counter'
version=vr("3.0")
temp=to11.Create(toName,toType,version)
to_high_speed_counter.append(temp)
###TO_PositioningAxis
いまの構成はこうです:
###Object作成
to11=software.TechnologicalObjectGroup.TechnologicalObjects
TO_PositioningAxis=[]
for i in range(2):
toName='TO_PositioningAxis'+str(i)
toType='TO_PositioningAxis'
version=vr("3.0")
temp=to11.Create(toName,toType,version)
TO_PositioningAxis.append(temp)
TO_PositioningAxis[0].Name
###Objectのパラメータ設定
TO_PositioningAxis[0].Parameters.Find('Actor.DataAdaption').Value=1
TO_PositioningAxis[0].Parameters.Find('_Actor.Interface.Telegram').Value=105
TO_PositioningAxis[0].Parameters.Find('_Sensor[1].Interface.Telegram').Value=105
###PLCとConnectする
#Get the Positioning Axis Object
x=TO_PositioningAxis[0]
#Get the AxisHardwareConnectionProvider from Motion packages
AxisHardwareConnectionProvider=x.GetService[Motion.AxisHardwareConnectionProvider]()
for device in myproject.Devices:
for deviceitem in device.DeviceItems:
print(deviceitem.Name)
v90=myproject.Devices[1].DeviceItems
v90_1=v90[1].DeviceItems[1]
v90_1_Deviceitem=v90[1].DeviceItems
v90_1_Deviceitem[2].DeviceItems[2].Name
AxisHardwareConnectionProvider.ActorInterface.Connect(v90_1_Deviceitem[2].DeviceItems[2])
##Full Code
import clr
clr.AddReference('C:\\Program Files\\Siemens\\Automation\\Portal V15_1\PublicAPI\\V15.1\\Siemens.Engineering.dll')
from System.IO import DirectoryInfo,FileInfo
import Siemens.Engineering as tia
import Siemens.Engineering.HW.Features as hwf
import Siemens.Engineering.SW.TechnologicalObjects.Motion as Motion
from Siemens.Engineering.SW.TechnologicalObjects import TechnologicalInstanceDB
from System import Version as vr
def openTIAProject(tia,open_path):
try:
project=tia.Projects.Open(open_path)
return project
except Exception as e:
print(e)
return None
open_path=FileInfo('C:\\tiav15_1_project\\project\\porject\\AppTest\\AppTest.ap15_1')
#Starting TIA
print ('Starting TIA with UI')
mytia = tia.TiaPortal(tia.TiaPortalMode.WithUserInterface)
myproject=openTIAProject(mytia,open_path)
kkkk=tia.IEngineeringServiceProvider((myproject.Devices[0].DeviceItems[1])).GetService[hwf.SoftwareContainer]()
software=kkkk.get_Software()
to11=software.TechnologicalObjectGroup.TechnologicalObjects
TO_PositioningAxis=[]
for i in range(2):
toName='TO_PositioningAxis'+str(i)
toType='TO_PositioningAxis'
version=vr("3.0")
temp=to11.Create(toName,toType,version)
TO_PositioningAxis.append(temp)
TO_PositioningAxis[0].Name
kkkk=tia.IEngineeringServiceProvider((myproject.Devices[0].DeviceItems[1])).GetService[hwf.SoftwareContainer]()
software=kkkk.get_Software()
#Get the Positioning Axis Object
x=TO_PositioningAxis[0]
#Get the AxisHardwareConnectionProvider from Motion packages
AxisHardwareConnectionProvider=x.GetService[Motion.AxisHardwareConnectionProvider]()
for device in myproject.Devices:
for deviceitem in device.DeviceItems:
print(deviceitem.Name)
v90=myproject.Devices[1].DeviceItems
v90_1=v90[1].DeviceItems[1]
v90_1_Deviceitem=v90[1].DeviceItems
v90_1_Deviceitem[2].DeviceItems[2].Name
AxisHardwareConnectionProvider.ActorInterface.Connect(v90_1_Deviceitem[2].DeviceItems[2])
##Processes
いま開いてるTIAをもらう。そのためにProcessesを使います。
import clr
clr.AddReference('C:\\Program Files\\Siemens\\Automation\\Portal V15_1\PublicAPI\\V15.1\\Siemens.Engineering.dll')
from System.IO import DirectoryInfo,FileInfo
import Siemens.Engineering as tia
import Siemens.Engineering.HW.Features as hwf
import Siemens.Engineering.SW.TechnologicalObjects.Motion as Motion
from Siemens.Engineering.SW.TechnologicalObjects import TechnologicalInstanceDB
from System import Version as vr
print('Hello,let me to get your process..')
processes=tia.TiaPortal.GetProcesses()
i=1
for process in processes:
print('---'*10)
#get the Process information
print('Process{} Information\n'
'-Path:{}\n'
'-Acquisition Time:{}\n'
'-ID:{}\n'
'-UI:{}\n'
.format(
i
,process.ProjectPath
,process.AcquisitionTime
,process.Id
,('Yes' if process.Mode >=1 else 'No')
))
attach=process.Attach()
for project in attach.get_Projects():
print('Project Information\n'
'-Name:{}\n'
'-Author:{}\n'
'-Comment:{}\n'
'-Copy Right:{}\n'
'-Creation time:{}\n'
'-Family:{}\n'\
'-IsModified:{}\n'
'-Language Settings:{}\n'
'-Last Modified:{}\n'
'-Last Modified By:{}\n'
'-Name:{}\n'
'-Path:{}\n'
'-Size:{}\n'
'-Version:{}\n'
.format(
project.Name
,project.Author
,project.Comment
,project.Copyright
,project.CreationTime
,project.Family
,project.IsModified
,project.LanguageSettings
,project.LastModified
,project.LastModifiedBy
,project.Name
,project.Path
,project.Size
,project.Version
))
print('Used Product:')
for UsedProduct in project.get_UsedProducts():
print('-'+UsedProduct.Name)
i+=1
print('\n')
a= input('Press key to exit\n')
if a :
exit(0)
##Hmi
###hmitarget
import Siemens.Engineering.Hmi as Hmi
import Siemens.Engineering.Hmi.Tag as HmiTag
import Siemens.Engineering.Hmi.Screen as HmiScreen
import Siemens.Engineering.Hmi.Cycle as HmiCycle
import Siemens.Engineering.Hmi.Communication as HmiCommunication
import Siemens.Engineering.Hmi.Globalization as HmiGlobalization
import Siemens.Engineering.Hmi.TextGraphicList as HmiTextGraphicList
import Siemens.Engineering.Hmi.RuntimeScripting as HmiRuntimeScripting
from Siemens.Engineering import ExportOptions as ExportOptions
from Siemens.Engineering import ImportOptions as ImportOptions
FUNCTION_END_WITHOUT_ERROR=7000
FUNCTION_END_WITH_ERROR=8900
IMPORT_HMI_PATH_CYCLES='C:\\tia_ExternalApps\\Export\\hmi\\templates\\templates.xml'
IMPORT_HMI_PATH_CYCLES_TEMP='C:\\tia_ExternalApps\\Export\\hmi\\templates\\_templates.xml'
Hmi1=project.Devices[2]
for Device in Hmi1.DeviceItems:
print(Device.Name)
hmitarget=tia.IEngineeringServiceProvider(Hmi1.DeviceItems[3]).GetService[hwf.SoftwareContainer]().Software
###Create Screen Folder
def CreateScreenFolder(hmitaget,FolderName=''):
'''Function to Create the ScreenFodler Inside your HMI_RT
Parameters
----------
hmitarget:HmiTarget Objects
The Object that you get from hwf.SoftwareContainer.
FolderName:String
The Folder Name that you would like to create.
Returns
----------
8900:
If Exception is happened while Function executing.
ScreenUserFolder:
The Screen Folder Object that you created.
'''
try:
hmitarget.ScreenFolder.Folders.Create(folderName)
except Exception as e:
print(e)
return FUNCTION_END_WITH_ERROR
return hmitarget.ScreenFolder.Folders.Find(folderName)
###Delete Screen From Folder
def DeleteScreenFromFolder(hmitarget,FolderName,ScreenName):
'''Function to Delete the Screen Locate on the folder Inside your HMI_RT
Parameters
----------
hmitarget:HmiTarget Objects
The Object that you get from hwf.SoftwareContainer.
FolderName:String
The Name of Folder that contatins the Screen which you want to delete.
ScreenName:String
The Name of Screen that you want to delete.
Returns
----------
8000:
Screen can not found inside the folder.
8900:
Screen is found, but Exception is happened while screen.Delete() executing.
7000:
Function is end without Error.
'''
try:
screenuserFolder=hmitarget.ScreenFolder.Folders.Find(FolderName)
screens=screenuserFolder.Screens
screen=screens.Find(ScreebnName)
if screen is None:
return 8000
else:
screen.Delete()
except Exception as e:
print(e)
return FUNCTION_END_WITH_ERROR
return FUNCTION_END_WITHOUT_ERROR
###Delete ScreenTemplate from folder
def DeleteScreenTemplateFromFolder(hmitarget,FolderName,ScreenName):
'''Function to Delete the Templatescreen Locate on the Templatefolder Inside your HMI_RT
Parameters
----------
hmitarget:HmiTarget Objects
The Object that you get from hwf.SoftwareContainer.
FolderName:String
The Name of Templatefolder that contatins the Screen which you want to delete.
ScreenName:String
The Name of Templatescreen that you want to delete.
Returns
----------
8000:
Screen can not found inside the folder.
8900:
Screen is found, but Exception is happened while screen.Delete() executing.
7000:
Function is end without Error.
'''
try:
folder=hmitarget.ScreenTemplateFolder.Folders.Find(FolderName)
if folder is None:
return 8000
else:
templates=folder.ScreenTemplates
template=templates.Find(ScreenName)
if template is None:
return 8001
else:
template.Delete()
except Exception as e:
print(e)
return FUNCTION_END_WITH_ERROR
return FUNCTION_END_WITHOUT_ERROR
###Delete All Screen from folder
def DeleteAllScreensFromFolder(hmitarget,FolderName):
'''Function to Delete the All Scrrens Locate on the folder Inside your HMI_RT
Parameters
----------
hmitarget:HmiTarget Objects
The Object that you get from hwf.SoftwareContainer.
FolderName:String
The Name of folder that contatins the Screen which you want to delete.
Returns
----------
8000:
Screen can not found inside the folder.
8900:
Screen is found, but Exception is happened while screen.Delete() executing.
7000:
Function is end without Error.
'''
try:
folder=hmitarget.ScreenFolder.Folders.Find(FolderName)
if folder is None:
return 8000
else:
screens=folder.Screens
screenlist=[]
for screen in screens:
screenlist.append(screen)
for screen in screenlist:
print('{} is deleted.'.format(screen.Name))
screen.Delete()
except Exception as e:
print(e)
return FUNCTION_END_WITH_ERROR
return FUNCTION_END_WITHOUT_ERROR
###Delete Cycles
def DeleteCycle(hmitarget,CycleName):
'''Function to Delete the Cycles Inside your HMI_RT
Parameters
----------
hmitarget:HmiTarget Objects
The Object that you get from hwf.SoftwareContainer.
Cycle:String
The Name of cycles that you want to delete.
Returns
----------
8000:
Screen can not found inside the folder.
8900:
Screen is found, but Exception is happened while screen.Delete() executing.
7000:
Function is end without Error.
'''
try:
cycles=hmitarget.Cycles
cycle=cycles.Find(CycleName)
if cycle is None:
return 8000
else:
print('{} is deleted.'.format(cycle.Name))
cycle.Delete()
except Exception as e:
print(e)
return FUNCTION_END_WITH_ERROR
return FUNCTION_END_WITHOUT_ERROR
DeleteCycle(hmitarget,'Cycle_2')
###Create Cycles
まず、CyclesをExportしたらこのようなXMLがあります。
<Hmi.Cycle.Cycle ID="0">
<AttributeList>
<CycleTime>250</CycleTime>
<CycleUnit>Second</CycleUnit>
<Name>CYCLE TIME TEST</Name>
<StartAtStartingPoint>true</StartAtStartingPoint>
<StartingPoint>****-**-**T**:**:**</StartingPoint>
<TriggerAtShutdown>false</TriggerAtShutdown>
<TriggerAtStartup>false</TriggerAtStartup>
</AttributeList>
<ObjectList>
<MultilingualText CompositionName="Comment" ID="1">
<ObjectList>
<MultilingualTextItem CompositionName="Items" ID="2">
<AttributeList>
<Culture>en-US</Culture>
<Text></Text>
</AttributeList>
</MultilingualTextItem>
</ObjectList>
</MultilingualText>
</ObjectList>
</Hmi.Cycle.Cycle>
その中に触る必要あるのは、CycleTime,CycleUnit,Nameかな?
なので、ElementTree XMLを使ってXMLの中身を編集し、TIAをへImportします。
import xml.etree.ElementTree as ET
def CreateHmiCycles(hmitarget,Name='Cycle_',CycleTime='1',CycleUnit='Second'):
tree=ET.parse(IMPORT_HMI_PATH_CYCLES)
root=tree.getroot()
AttributeList=root.find('AttributeList')
AttributeList.find('CycleTime').text=CycleTime
AttributeList.find('CycleUnit').text=CycleUnit
i,CycleName=1,Name
while True:
Cycle=hmitarget.Cycles.Find(CycleName)
if Cycle is not None:
CycleName=Name+'_'+str(i)
i+=1
print(CycleName)
else:
AttributeList.find('Name').text=CycleName
break
if i>100:
break
tree.write(IMPORT_HMI_PATH_CYCLES_TEMP)
hmitarget.Cycles.Import(FileInfo(IMPORT_HMI_PATH_CYCLES_TEMP),ImportOptions.Override)
CreateHmiCycles(hmitarget,'Cycle11',CycleTime='1')
はい、以上ですー