【博圖TIA-Api】通過Excel自動新建文件夾和導入FB塊
- 說明
- 思路
- 準備
- 獲取Excel表格內文件名和FB塊名等信息
- 新建文件夾部分
- 篩分獲取的文件夾數據,去掉重復內容
- 創建文件夾
- 導入FB塊
- 導出FB塊的xml文件
- 查找需要放置的文件夾
- 導入塊
說明
續上一篇文章,這次是根據Excel表格在程序內新建文件夾和導入FB塊。
思路
- 調用TIA的Api接口
- 實現方式為C#的“Windows 窗體應用(.NET Framework),(默認PC已經裝了Visual Studio)
- 文件夾名和FB塊名存在Excel文件中,導入時需要選擇文檔
- 西門子子接口使用文檔(中文的) 點擊鏈接進入
- 注意如果文件夾已經存在就不能新建。
- FB塊如果存在可以覆蓋,方便快速修改。
準備
該文章已提過的準備事項就不再重復,只提及未重復的。鏈接: 【博圖TIA-Api】通過Excel自動快速導入IO變量
獲取Excel表格內文件名和FB塊名等信息
上述鏈接可查看。
新建文件夾部分
篩分獲取的文件夾數據,去掉重復內容
注意這里并不是去除程序內的重復文件夾,只是對Excel文件內讀取的文件名去重。
public static void CreatNewFileGroup(string filepath, PlcSoftware plcsoftware, bool enabled)
{if (!enabled){return;}string[] result = new string[300];int i;int j = 1;bool Mid;string[,] strings = new string[1000, 15];strings = ManualImport.ManualReadExcelFile(filepath);//篩選出所有組名for (i = 1; strings[i, 1] != null; i++){Mid = false;//有重復的就不加入數組foreach (string strmid in result){if (strmid == strings[i, 1]){Mid = true;break;}}//沒重復的添加進數組if (!Mid){result[j] = strings[i, 1];j++;}Mid = true;}//調用文件夾新建程序for (i = 1; result[i] != null; i++){ManualImport.CreateBlockGroup(plcsoftware, result[i]);}
}
創建文件夾
注意由于PLC內文件夾可能會有很多層級,我這里默認是三個層級,如果層級更多可以按照這樣寫。[注]
public static void CreateBlockGroup(PlcSoftware plcsoftware, string FileName)
{//測試用string[] strings = new string[20];int i, j;PlcBlockGroup userblock1, userblock2, userblock3, userblock4;PlcBlockGroup finallyblock;PlcBlockSystemGroup systemGroup = plcsoftware.BlockGroup;//測試用于查看塊組名字--程序塊#region 已屏蔽//string NameBlock =systemGroup.Name;#endregion//獲取程序塊下三個大文件夾,第0個是程序塊文件夾最下面的一個,也就是需要的#region 獲取 根目錄i = 0;j = 0;foreach (PlcBlockGroup blockgroup in systemGroup.Groups){strings[i] = blockgroup.Name;if (strings[i] == "根目錄名"){j = i;}i = i + 1;}userblock1 = systemGroup.Groups[j];#endregion#region 獲取 層級一i = 0;j = 0;foreach (PlcBlockGroup blockgroup in userblock1.Groups){strings[i] = blockgroup.Name;if (strings[i] == "層級一名"){j = i;}i = i + 1;}userblock2 = userblock1.Groups[j];#endregion#region 獲取 層級二i = 0;j = 0;foreach (PlcBlockGroup blockgroup in userblock2.Groups){strings[i] = blockgroup.Name;if (strings[i] == "層級二名"){j = i;}i = i + 1;}userblock3 = userblock2.Groups[j];#endregion#region 獲取 層級三i = 0;j = 0;foreach (PlcBlockGroup blockgroup in userblock3.Groups){strings[i] = blockgroup.Name;if (strings[i] == "層級三名"){j = i;}i = i + 1;}userblock4 = userblock3.Groups[j];#endregionfinallyblock = userblock4;//確保文件夾不重復j = 0;foreach (PlcBlockGroup blockgroup in finallyblock.Groups){strings[i] = blockgroup.Name;if (strings[i] == FileName){//代表文件夾已經存在j = 100;}i = i + 1;}if (j == 100){return;}else{PlcBlockUserGroupComposition groupComposition = finallyblock.Groups;//新建文件夾名PlcBlockUserGroup myCreatedGroup = groupComposition.Create(FileName);}}
導入FB塊
導出FB塊的xml文件
注意一般這個功能適合哪些重復的FB塊導入,比如說一些標準塊。
導出FB塊的xml文件可以從版本控制接口導出。
查找需要放置的文件夾
這里就以之前的三個層級位置舉例。
這里需要返回需要的文件夾變量PlcBlockGroup
public static PlcBlockGroup FindMovementFB(string BlockGroupName, PlcSoftware plcsoftware){string[] strings = new string[20];int i, j;PlcBlockGroup userblock1, userblock2, userblock3, userblock4, userblock5;PlcBlockGroup finallyblock;PlcBlockSystemGroup systemGroup = plcsoftware.BlockGroup;//測試用于查看塊組名字--程序塊#region 已屏蔽//string NameBlock =systemGroup.Name;#endregion//獲取程序塊下三個大文件夾,第0個是程序塊文件夾最下面的一個,也就是需要的OEM#region 獲取 根目錄i = 0;j = 0;foreach (PlcBlockGroup blockgroup in systemGroup.Groups){strings[i] = blockgroup.Name;if (strings[i] == "根目錄名"){j = i;}i = i + 1;}userblock1 = systemGroup.Groups[j];#endregion#region 獲取 層級一i = 0;j = 0;foreach (PlcBlockGroup blockgroup in userblock1.Groups){strings[i] = blockgroup.Name;if (strings[i] == "層級一名"){j = i;}i = i + 1;}userblock2 = userblock1.Groups[j];#endregion#region 獲取 層級二i = 0;j = 0;foreach (PlcBlockGroup blockgroup in userblock2.Groups){strings[i] = blockgroup.Name;if (strings[i] == "層級二名"){j = i;}i = i + 1;}userblock3 = userblock2.Groups[j];#endregion#region 獲取 層級三i = 0;j = 0;foreach (PlcBlockGroup blockgroup in userblock3.Groups){strings[i] = blockgroup.Name;if (strings[i] == "層級三名"){j = i;}i = i + 1;}userblock4 = userblock3.Groups[j];#endregioni = 0;j = 0;foreach (PlcBlockGroup blockgroup in userblock4.Groups){strings[i] = blockgroup.Name;if (strings[i] == BlockGroupName){j = i;}i = i + 1;if (i >= 30){break;}}userblock5 = userblock4.Groups[j];#region 獲取需要放置的文件夾#endregionfinallyblock = userblock5;//返回需要的PlcBlockGroupreturn finallyblock;}
導入塊
這里的xml文件默認放在改程序的根目錄。
public static void InputMovementFB(string filepath, string Xmlpath, PlcSoftware plcsoftware, bool enabled)
{if (!enabled){return;}string[] result = new string[300];int i;int j = 1;bool Mid;string[,] strings = new string[1000, 18];//讀取Excel表格內容strings = ManualImport.ManualReadExcelFile(filepath);XmlDocument xmlDoc = new XmlDocument();//加載xml文件,文件xmlDoc.Load(Xmlpath);bool mid1, mid2, mid3;for (i = 1; strings[i, 1] != null; i++){#region 修改FB塊名字//查找要修改的節點XmlNode Name = xmlDoc.SelectSingleNode("Document/SW.Blocks.FB/AttributeList");//取出所有的子節點XmlNodeList xnl = Name.ChildNodes;mid1 = false;mid2 = false;//取出PLC變量表名字foreach (XmlNode xmlNode in xnl){//將節點轉換一下類型XmlElement xmlElement = (XmlElement)xmlNode;//判斷該子節點是否是要查找的節點if (xmlElement.Name == "Name"){//設置新值xmlElement.InnerText = "NO" + strings[i,2]+"MB"+ strings[i,5]+"_"+ strings[i,3];mid1 = true;}//判斷該子節點是否是要查找的節點if (xmlElement.Name == "Number"){ //設置新值xmlElement.InnerText = Convert.ToString(600+(Convert.ToInt32(strings[i, 2])-1)*20+Convert.ToInt32(strings[i, 5]));mid2 = true;}if (mid1 && mid2){break;}}#endregion//保存修改的Xml文件內容xmlDoc.Save(Xmlpath);FindMovementFB(strings[i, 1], plcsoftware).Blocks.Import(new FileInfo(Xmlpath), ImportOptions.Override); ;}}
注意這里修改的xml文件位置在此處