Program.cs 107 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Runtime.InteropServices;
  6. using System.Security.Cryptography.X509Certificates;
  7. using Newtonsoft.Json;
  8. using Newtonsoft.Json.Linq;
  9. namespace ConsoleApp2
  10. {
  11. public class CommandInfo
  12. {
  13. public ushort ID { get; set; }
  14. public byte Type { get; set; }
  15. public ushort Command { get; set; }
  16. public List<ushort> Data { get; set; }
  17. }
  18. internal class Program
  19. {
  20. static UInt16 FuncionType = 0;
  21. #region CRC32校验
  22. static UInt32[] crc32_table = new UInt32[256]
  23. {
  24. 0x00000000, 0x04C11DB7, 0x09823B6E, 0x0D4326D9, 0x130476DC, 0x17C56B6B,
  25. 0x1A864DB2, 0x1E475005, 0x2608EDB8, 0x22C9F00F, 0x2F8AD6D6, 0x2B4BCB61,
  26. 0x350C9B64, 0x31CD86D3, 0x3C8EA00A, 0x384FBDBD, 0x4C11DB70, 0x48D0C6C7,
  27. 0x4593E01E, 0x4152FDA9, 0x5F15ADAC, 0x5BD4B01B, 0x569796C2, 0x52568B75,
  28. 0x6A1936C8, 0x6ED82B7F, 0x639B0DA6, 0x675A1011, 0x791D4014, 0x7DDC5DA3,
  29. 0x709F7B7A, 0x745E66CD, 0x9823B6E0, 0x9CE2AB57, 0x91A18D8E, 0x95609039,
  30. 0x8B27C03C, 0x8FE6DD8B, 0x82A5FB52, 0x8664E6E5, 0xBE2B5B58, 0xBAEA46EF,
  31. 0xB7A96036, 0xB3687D81, 0xAD2F2D84, 0xA9EE3033, 0xA4AD16EA, 0xA06C0B5D,
  32. 0xD4326D90, 0xD0F37027, 0xDDB056FE, 0xD9714B49, 0xC7361B4C, 0xC3F706FB,
  33. 0xCEB42022, 0xCA753D95, 0xF23A8028, 0xF6FB9D9F, 0xFBB8BB46, 0xFF79A6F1,
  34. 0xE13EF6F4, 0xE5FFEB43, 0xE8BCCD9A, 0xEC7DD02D, 0x34867077, 0x30476DC0,
  35. 0x3D044B19, 0x39C556AE, 0x278206AB, 0x23431B1C, 0x2E003DC5, 0x2AC12072,
  36. 0x128E9DCF, 0x164F8078, 0x1B0CA6A1, 0x1FCDBB16, 0x018AEB13, 0x054BF6A4,
  37. 0x0808D07D, 0x0CC9CDCA, 0x7897AB07, 0x7C56B6B0, 0x71159069, 0x75D48DDE,
  38. 0x6B93DDDB, 0x6F52C06C, 0x6211E6B5, 0x66D0FB02, 0x5E9F46BF, 0x5A5E5B08,
  39. 0x571D7DD1, 0x53DC6066, 0x4D9B3063, 0x495A2DD4, 0x44190B0D, 0x40D816BA,
  40. 0xACA5C697, 0xA864DB20, 0xA527FDF9, 0xA1E6E04E, 0xBFA1B04B, 0xBB60ADFC,
  41. 0xB6238B25, 0xB2E29692, 0x8AAD2B2F, 0x8E6C3698, 0x832F1041, 0x87EE0DF6,
  42. 0x99A95DF3, 0x9D684044, 0x902B669D, 0x94EA7B2A, 0xE0B41DE7, 0xE4750050,
  43. 0xE9362689, 0xEDF73B3E, 0xF3B06B3B, 0xF771768C, 0xFA325055, 0xFEF34DE2,
  44. 0xC6BCF05F, 0xC27DEDE8, 0xCF3ECB31, 0xCBFFD686, 0xD5B88683, 0xD1799B34,
  45. 0xDC3ABDED, 0xD8FBA05A, 0x690CE0EE, 0x6DCDFD59, 0x608EDB80, 0x644FC637,
  46. 0x7A089632, 0x7EC98B85, 0x738AAD5C, 0x774BB0EB, 0x4F040D56, 0x4BC510E1,
  47. 0x46863638, 0x42472B8F, 0x5C007B8A, 0x58C1663D, 0x558240E4, 0x51435D53,
  48. 0x251D3B9E, 0x21DC2629, 0x2C9F00F0, 0x285E1D47, 0x36194D42, 0x32D850F5,
  49. 0x3F9B762C, 0x3B5A6B9B, 0x0315D626, 0x07D4CB91, 0x0A97ED48, 0x0E56F0FF,
  50. 0x1011A0FA, 0x14D0BD4D, 0x19939B94, 0x1D528623, 0xF12F560E, 0xF5EE4BB9,
  51. 0xF8AD6D60, 0xFC6C70D7, 0xE22B20D2, 0xE6EA3D65, 0xEBA91BBC, 0xEF68060B,
  52. 0xD727BBB6, 0xD3E6A601, 0xDEA580D8, 0xDA649D6F, 0xC423CD6A, 0xC0E2D0DD,
  53. 0xCDA1F604, 0xC960EBB3, 0xBD3E8D7E, 0xB9FF90C9, 0xB4BCB610, 0xB07DABA7,
  54. 0xAE3AFBA2, 0xAAFBE615, 0xA7B8C0CC, 0xA379DD7B, 0x9B3660C6, 0x9FF77D71,
  55. 0x92B45BA8, 0x9675461F, 0x8832161A, 0x8CF30BAD, 0x81B02D74, 0x857130C3,
  56. 0x5D8A9099, 0x594B8D2E, 0x5408ABF7, 0x50C9B640, 0x4E8EE645, 0x4A4FFBF2,
  57. 0x470CDD2B, 0x43CDC09C, 0x7B827D21, 0x7F436096, 0x7200464F, 0x76C15BF8,
  58. 0x68860BFD, 0x6C47164A, 0x61043093, 0x65C52D24, 0x119B4BE9, 0x155A565E,
  59. 0x18197087, 0x1CD86D30, 0x029F3D35, 0x065E2082, 0x0B1D065B, 0x0FDC1BEC,
  60. 0x3793A651, 0x3352BBE6, 0x3E119D3F, 0x3AD08088, 0x2497D08D, 0x2056CD3A,
  61. 0x2D15EBE3, 0x29D4F654, 0xC5A92679, 0xC1683BCE, 0xCC2B1D17, 0xC8EA00A0,
  62. 0xD6AD50A5, 0xD26C4D12, 0xDF2F6BCB, 0xDBEE767C, 0xE3A1CBC1, 0xE760D676,
  63. 0xEA23F0AF, 0xEEE2ED18, 0xF0A5BD1D, 0xF464A0AA, 0xF9278673, 0xFDE69BC4,
  64. 0x89B8FD09, 0x8D79E0BE, 0x803AC667, 0x84FBDBD0, 0x9ABC8BD5, 0x9E7D9662,
  65. 0x933EB0BB, 0x97FFAD0C, 0xAFB010B1, 0xAB710D06, 0xA6322BDF, 0xA2F33668,
  66. 0xBCB4666D, 0xB8757BDA, 0xB5365D03, 0xB1F740B4
  67. };
  68. static UInt32 crc32_cal(byte[] pData, UInt16 Length)
  69. {
  70. UInt32 nReg;
  71. UInt32 nTemp = 0;
  72. UInt16 i, n;
  73. nReg = 0xFFFFFFFF;
  74. for (n = 0; n < Length; n++)
  75. {
  76. nReg ^= (UInt32)pData[n];
  77. for (i = 0; i < 4; i++)
  78. {
  79. nTemp = crc32_table[((nReg >> 24) & 0xFF)];
  80. nReg <<= 8;
  81. nReg ^= nTemp;
  82. }
  83. }
  84. return nReg;
  85. }
  86. #endregion
  87. #region 输入CmdCode,转换为String存储该条指令
  88. static string CmdCode_To_CmdSave(ushort ID, byte Type, byte[] Code)
  89. {
  90. string result = "";
  91. byte[] input = new byte[255];
  92. UInt32 crc_rel = 0;
  93. ushort DataLen = 0;
  94. input[0] = 0x55; input[1] = 0xAA; input[2] = (byte)(ID >> 8); input[3] = (byte)(ID & 0xFF); input[4] = Type;
  95. DataLen = (ushort)Code[1];
  96. input[5] = (byte)(DataLen + 2);
  97. for (int i = 0; i < DataLen + 2; i++)
  98. {
  99. input[6 + i] = Code[i];
  100. }
  101. crc_rel = crc32_cal(input, (ushort)(DataLen + 8));
  102. input[8 + DataLen] = (byte)(crc_rel >> 24);
  103. input[9 + DataLen] = (byte)(crc_rel >> 16);
  104. input[10 + DataLen] = (byte)(crc_rel >> 8);
  105. input[11 + DataLen] = (byte)crc_rel;
  106. input[12 + DataLen] = 0xF0;
  107. for (int i = 0; i < DataLen + 13; i++)
  108. {
  109. result += Convert.ToString(input[i], 16).PadLeft(2, '0').ToUpper() + " ";
  110. }
  111. return result;
  112. }
  113. #endregion
  114. static void Main(string[] args)
  115. {
  116. Console.WriteLine("欢迎使用 MOTINOVA E-Bike 驱动系统参数生成软件 V2.0.2 20240515");
  117. Console.WriteLine("修改记录:");
  118. Console.WriteLine("20240515 针对大牙盘增加关机指令,避免客户忘关机导致参数未存储。\r\n");
  119. //账户登录
  120. Console.WriteLine("请输入使用密码:");
  121. if (Console.ReadLine() != "123456")
  122. {
  123. Console.WriteLine("密码错误!");
  124. Console.ReadKey();
  125. return;
  126. }
  127. //选择电机类型
  128. Console.WriteLine("请输入电机类型:");
  129. Console.WriteLine("F1:小牙盘 F2:大牙盘/轮毂 F3:通用指令");
  130. ConsoleKey GetKey = Console.ReadKey().Key;
  131. if (GetKey == ConsoleKey.F1) //小牙盘
  132. {
  133. FuncionType = 1;
  134. }
  135. else if (GetKey == ConsoleKey.F2) //大牙盘
  136. {
  137. FuncionType = 2;
  138. }
  139. else if (GetKey == ConsoleKey.F3) //通用指令
  140. {
  141. FuncionType = 3;
  142. }
  143. else
  144. {
  145. Console.WriteLine("请正确选择电机类型!");
  146. Console.ReadKey();
  147. return;
  148. }
  149. //输入文件
  150. Console.WriteLine("请输入文件名称:");
  151. string inputFilename = Console.ReadLine();
  152. if (File.Exists(inputFilename + ".src"))//检查文件是否存在
  153. {
  154. Console.WriteLine("检查源文件成功!");
  155. Console.WriteLine("文件名:" + inputFilename + ".src");
  156. }
  157. else if (File.Exists(inputFilename + ".json"))//检查文件是否存在
  158. {
  159. Console.WriteLine("检查源文件成功!");
  160. Console.WriteLine("文件名:" + inputFilename + ".json");
  161. }
  162. else
  163. {
  164. Console.WriteLine("请检查源文件是否存在!");
  165. Console.ReadKey();
  166. return;
  167. }
  168. //读取并显示源文件
  169. #if false
  170. StreamReader objReader = new StreamReader(System.IO.Directory.GetCurrentDirectory() + "\\ModelFile.src");
  171. string sLine = "";
  172. ArrayList arrText = new ArrayList();//创建一个动态数组
  173. while (sLine != null)
  174. {
  175. sLine = objReader.ReadLine();
  176. arrText.Add(sLine);
  177. }
  178. objReader.Close();
  179. foreach (string sOutput in arrText)
  180. {
  181. Console.WriteLine(sOutput + "\r\n");
  182. }
  183. #endif
  184. //开始转换文件
  185. if (FuncionType == 1) //小牙盘
  186. {
  187. StreamReader objReader = new StreamReader(System.IO.Directory.GetCurrentDirectory() + "\\" + inputFilename + ".src");
  188. string sLine = "";
  189. ArrayList arrText = new ArrayList();//创建一个动态数组
  190. while (sLine != null)
  191. {
  192. sLine = objReader.ReadLine();
  193. arrText.Add(sLine);
  194. }
  195. objReader.Close();
  196. try
  197. {
  198. string filename = inputFilename + ".ttcfg";
  199. if (File.Exists(filename))//文件已存在,直接退出
  200. {
  201. Console.WriteLine("文件已存在!");
  202. Console.ReadKey();
  203. return;
  204. }
  205. else//文件名有效,转换后的数据存在该文件中
  206. {
  207. //创建文件
  208. FileStream fs = File.Create(filename);
  209. fs.Close();
  210. //建立字典,存放并获取每个命令的行号
  211. Dictionary<string, int> DicRowNum = new Dictionary<string, int>();
  212. DicRowNum.Add("[校验码]", 0);
  213. DicRowNum.Add("[自定义1]", 0);
  214. DicRowNum.Add("[自定义2]", 0);
  215. DicRowNum.Add("[自定义3]", 0);
  216. DicRowNum.Add("[用户参数1]", 0);
  217. DicRowNum.Add("[马达参数]", 0);
  218. DicRowNum.Add("[型号]", 0);
  219. DicRowNum.Add("[SN号]", 0);
  220. DicRowNum.Add("[生产信息]", 0);
  221. DicRowNum.Add("[单力矩标定系数]", 0);
  222. DicRowNum.Add("[启动值]", 0);
  223. DicRowNum.Add("[用户参数2]", 0);
  224. DicRowNum.Add("[三力矩标定系数1]", 0);
  225. DicRowNum.Add("[三力矩标定系数2]", 0);
  226. DicRowNum.Add("[三力矩标定系数3]", 0);
  227. Dictionary<string, int> __dict = new Dictionary<string, int>(DicRowNum);
  228. foreach (KeyValuePair<string, int> item in __dict)
  229. {
  230. foreach (string cmd in arrText)
  231. {
  232. if (cmd.Contains(item.Key))
  233. {
  234. DicRowNum[item.Key] = arrText.IndexOf(cmd);
  235. break;
  236. }
  237. }
  238. }
  239. //开始遍历,转换每条指令对应的数据
  240. using (StreamWriter file = new StreamWriter(filename))
  241. {
  242. foreach (string index in DicRowNum.Keys)
  243. {
  244. int rowNum = DicRowNum[index];
  245. //判断该命令是否打开
  246. if (arrText[rowNum].ToString().Split(',')[1] == "0")//该指令关闭
  247. {
  248. continue;
  249. }
  250. else//该指令打开
  251. {
  252. //写入命令功能
  253. file.WriteLine(index);
  254. var CmdCode = new byte[34];
  255. switch (index)
  256. {
  257. case "[校验码]":
  258. {
  259. CmdCode[0] = 0x11;
  260. CmdCode[1] = 0x08;
  261. string KeyString = arrText[rowNum + 1].ToString().Split(',')[1];
  262. for (ushort i = 0; i < ((KeyString.Length > 8) ? 8 : KeyString.Length); i++)
  263. {
  264. CmdCode[2 + i] = (byte)KeyString[i];
  265. }
  266. file.WriteLine(CmdCode_To_CmdSave(0x751, 0x16, CmdCode));
  267. break;
  268. }
  269. case "[自定义1]":
  270. {
  271. CmdCode[0] = 0x14;
  272. CmdCode[1] = 0x10;
  273. string UserInfo1String = arrText[rowNum + 1].ToString().Split(',')[1];
  274. for (ushort i = 0; i < ((UserInfo1String.Length > 16) ? 16 : UserInfo1String.Length); i++)
  275. {
  276. CmdCode[2 + i] = (byte)UserInfo1String[i];
  277. }
  278. file.WriteLine(CmdCode_To_CmdSave(0x751, 0x16, CmdCode));
  279. break;
  280. }
  281. case "[自定义2]":
  282. {
  283. CmdCode[0] = 0x16;
  284. CmdCode[1] = 0x10;
  285. string UserInfo1String = arrText[rowNum + 1].ToString().Split(',')[1];
  286. for (ushort i = 0; i < ((UserInfo1String.Length > 16) ? 16 : UserInfo1String.Length); i++)
  287. {
  288. CmdCode[2 + i] = (byte)UserInfo1String[i];
  289. }
  290. file.WriteLine(CmdCode_To_CmdSave(0x751, 0x16, CmdCode));
  291. break;
  292. }
  293. case "[自定义3]":
  294. {
  295. CmdCode[0] = 0x18;
  296. CmdCode[1] = 0x10;
  297. string UserInfo1String = arrText[rowNum + 1].ToString().Split(',')[1];
  298. for (ushort i = 0; i < ((UserInfo1String.Length > 16) ? 16 : UserInfo1String.Length); i++)
  299. {
  300. CmdCode[2 + i] = (byte)UserInfo1String[i];
  301. }
  302. file.WriteLine(CmdCode_To_CmdSave(0x751, 0x16, CmdCode));
  303. break;
  304. }
  305. case "[用户参数1]":
  306. {
  307. CmdCode[0] = 0x1B;
  308. CmdCode[1] = 0x20;
  309. ushort DataTemp;
  310. //指拨模式
  311. CmdCode[2] = Convert.ToByte(arrText[rowNum + 1].ToString().Split(',')[1]);
  312. //启动模式
  313. CmdCode[3] = Convert.ToByte(arrText[rowNum + 2].ToString().Split(',')[1]);
  314. //停机时间
  315. DataTemp = Convert.ToUInt16(arrText[rowNum + 3].ToString().Split(',')[1]);
  316. CmdCode[4] = (byte)(DataTemp & 0xFF);
  317. CmdCode[5] = (byte)(DataTemp >> 8);
  318. //限速
  319. CmdCode[6] = Convert.ToByte(arrText[rowNum + 4].ToString().Split(',')[1]);
  320. //下降速度
  321. CmdCode[7] = Convert.ToByte(arrText[rowNum + 5].ToString().Split(',')[1]);
  322. //前飞
  323. CmdCode[8] = Convert.ToByte(arrText[rowNum + 6].ToString().Split(',')[1]);
  324. //后飞
  325. CmdCode[9] = Convert.ToByte(arrText[rowNum + 7].ToString().Split(',')[1]);
  326. //限流
  327. CmdCode[10] = Convert.ToByte(arrText[rowNum + 8].ToString().Split(',')[1]);
  328. //温度预警
  329. CmdCode[11] = (byte)(Convert.ToByte(arrText[rowNum + 9].ToString().Split(',')[1]) + 40);
  330. //温度保护
  331. CmdCode[12] = (byte)(Convert.ToByte(arrText[rowNum + 10].ToString().Split(',')[1]) + 40);
  332. //无PBU
  333. CmdCode[13] = Convert.ToByte(arrText[rowNum + 11].ToString().Split(',')[1]);
  334. //轮胎周长
  335. CmdCode[14] = Convert.ToByte(arrText[rowNum + 12].ToString().Split(',')[1]);
  336. //电机系列号
  337. CmdCode[15] = Convert.ToByte(arrText[rowNum + 13].ToString().Split(',')[1]);
  338. //ECO助力增益
  339. CmdCode[16] = Convert.ToByte(arrText[rowNum + 14].ToString().Split(',')[1]);
  340. //ECO加速
  341. CmdCode[17] = Convert.ToByte(arrText[rowNum + 15].ToString().Split(',')[1]);
  342. //NORM助力增益
  343. CmdCode[18] = Convert.ToByte(arrText[rowNum + 16].ToString().Split(',')[1]);
  344. //NORM加速
  345. CmdCode[19] = Convert.ToByte(arrText[rowNum + 17].ToString().Split(',')[1]);
  346. //SPORT助力增益
  347. CmdCode[20] = Convert.ToByte(arrText[rowNum + 18].ToString().Split(',')[1]);
  348. //SPORT加速
  349. CmdCode[21] = Convert.ToByte(arrText[rowNum + 19].ToString().Split(',')[1]);
  350. //TURBO助力增益
  351. CmdCode[22] = Convert.ToByte(arrText[rowNum + 20].ToString().Split(',')[1]);
  352. //TURBO加速
  353. CmdCode[23] = Convert.ToByte(arrText[rowNum + 21].ToString().Split(',')[1]);
  354. //SMART助力增益
  355. CmdCode[24] = Convert.ToByte(arrText[rowNum + 22].ToString().Split(',')[1]);
  356. //SMART加速
  357. CmdCode[25] = Convert.ToByte(arrText[rowNum + 23].ToString().Split(',')[1]);
  358. //速度传感器信号个数
  359. CmdCode[26] = Convert.ToByte(arrText[rowNum + 24].ToString().Split(',')[1]);
  360. //踏频启动信号个数
  361. CmdCode[27] = Convert.ToByte(arrText[rowNum + 25].ToString().Split(',')[1]);
  362. //速度传感器
  363. CmdCode[28] = Convert.ToByte(arrText[rowNum + 26].ToString().Split(',')[1]);
  364. //周长微调
  365. CmdCode[29] = (byte)Convert.ToInt16(arrText[rowNum + 27].ToString().Split(',')[1]);
  366. //低压保护阈值
  367. DataTemp = Convert.ToUInt16(arrText[rowNum + 28].ToString().Split(',')[1]);
  368. CmdCode[30] = (byte)(DataTemp & 0xFF);
  369. CmdCode[31] = (byte)(DataTemp >> 8);
  370. //推行限速
  371. DataTemp = Convert.ToByte(arrText[rowNum + 29].ToString().Split(',')[1]);
  372. CmdCode[32] = (byte)Convert.ToByte(DataTemp);
  373. //推行马达转速
  374. CmdCode[33] = (byte)Convert.ToByte(arrText[rowNum + 30].ToString().Split(',')[1]);
  375. file.WriteLine(CmdCode_To_CmdSave(0x751, 0x16, CmdCode));
  376. break;
  377. }
  378. case "[马达参数]":
  379. {
  380. CmdCode[0] = 0x1D;
  381. CmdCode[1] = 0x10;
  382. ushort DataTemp;
  383. //额定功率
  384. DataTemp = Convert.ToUInt16(arrText[rowNum + 1].ToString().Split(',')[1]);
  385. CmdCode[2] = (byte)(DataTemp & 0xFF);
  386. CmdCode[3] = (byte)(DataTemp >> 8);
  387. //额定转速
  388. DataTemp = Convert.ToUInt16(arrText[rowNum + 2].ToString().Split(',')[1]);
  389. CmdCode[4] = (byte)(DataTemp & 0xFF);
  390. CmdCode[5] = (byte)(DataTemp >> 8);
  391. //定子电阻
  392. DataTemp = Convert.ToUInt16(arrText[rowNum + 3].ToString().Split(',')[1]);
  393. CmdCode[6] = (byte)(DataTemp & 0xFF);
  394. CmdCode[7] = (byte)(DataTemp >> 8);
  395. //Lq
  396. DataTemp = Convert.ToUInt16(arrText[rowNum + 4].ToString().Split(',')[1]);
  397. CmdCode[8] = (byte)(DataTemp & 0xFF);
  398. CmdCode[9] = (byte)(DataTemp >> 8);
  399. //Ld
  400. DataTemp = Convert.ToUInt16(arrText[rowNum + 5].ToString().Split(',')[1]);
  401. CmdCode[10] = (byte)(DataTemp & 0xFF);
  402. CmdCode[11] = (byte)(DataTemp >> 8);
  403. //反电动势
  404. DataTemp = Convert.ToUInt16(arrText[rowNum + 6].ToString().Split(',')[1]);
  405. CmdCode[12] = (byte)(DataTemp & 0xFF);
  406. CmdCode[13] = (byte)(DataTemp >> 8);
  407. //额定电压
  408. CmdCode[14] = Convert.ToByte(arrText[rowNum + 7].ToString().Split(',')[1]);
  409. file.WriteLine(CmdCode_To_CmdSave(0x751, 0x16, CmdCode));
  410. break;
  411. }
  412. case "[型号]":
  413. {
  414. CmdCode[0] = 0x22;
  415. CmdCode[1] = 0x10;
  416. string ModeString = arrText[rowNum + 1].ToString().Split(',')[1];
  417. for (ushort i = 0; i < ((ModeString.Length > 16) ? 16 : ModeString.Length); i++)
  418. {
  419. CmdCode[2 + i] = (byte)ModeString[i];
  420. }
  421. file.WriteLine(CmdCode_To_CmdSave(0x751, 0x16, CmdCode));
  422. break;
  423. }
  424. case "[SN号]":
  425. {
  426. CmdCode[0] = 0x23;
  427. CmdCode[1] = 0x10;
  428. string SnString = arrText[rowNum + 1].ToString().Split(',')[1];
  429. for (ushort i = 0; i < ((SnString.Length > 16) ? 16 : SnString.Length); i++)
  430. {
  431. CmdCode[2 + i] = (byte)SnString[i];
  432. }
  433. file.WriteLine(CmdCode_To_CmdSave(0x751, 0x16, CmdCode));
  434. break;
  435. }
  436. case "[生产信息]":
  437. {
  438. CmdCode[0] = 0x24;
  439. CmdCode[1] = 0x20;
  440. string MAC_Info = arrText[rowNum + 1].ToString().Split(',')[1];
  441. for (ushort i = 0; i < ((MAC_Info.Length > 8) ? 8 : MAC_Info.Length); i++)
  442. {
  443. CmdCode[2 + i] = (byte)MAC_Info[i];
  444. }
  445. MAC_Info = arrText[rowNum + 2].ToString().Split(',')[1];
  446. for (ushort i = 0; i < ((MAC_Info.Length > 8) ? 8 : MAC_Info.Length); i++)
  447. {
  448. CmdCode[10 + i] = (byte)MAC_Info[i];
  449. }
  450. MAC_Info = arrText[rowNum + 3].ToString().Split(',')[1];
  451. for (ushort i = 0; i < ((MAC_Info.Length > 8) ? 8 : MAC_Info.Length); i++)
  452. {
  453. CmdCode[18 + i] = (byte)MAC_Info[i];
  454. }
  455. MAC_Info = arrText[rowNum + 4].ToString().Split(',')[1];
  456. for (ushort i = 0; i < ((MAC_Info.Length > 8) ? 8 : MAC_Info.Length); i++)
  457. {
  458. CmdCode[26 + i] = (byte)MAC_Info[i];
  459. }
  460. file.WriteLine(CmdCode_To_CmdSave(0x751, 0x16, CmdCode));
  461. break;
  462. }
  463. case "[单力矩标定系数]":
  464. {
  465. CmdCode[0] = 0x2A;
  466. CmdCode[1] = 0x01;
  467. ushort DataTemp;
  468. DataTemp = Convert.ToUInt16(arrText[rowNum + 1].ToString().Split(',')[1]);
  469. CmdCode[2] = (byte)DataTemp;
  470. file.WriteLine(CmdCode_To_CmdSave(0x751, 0x16, CmdCode));
  471. break;
  472. }
  473. case "[启动值]":
  474. {
  475. CmdCode[0] = 0x2B;
  476. CmdCode[1] = 0x02;
  477. ushort DataTemp;
  478. DataTemp = Convert.ToUInt16(arrText[rowNum + 1].ToString().Split(',')[1]);
  479. CmdCode[2] = (byte)(DataTemp);
  480. CmdCode[3] = (byte)(DataTemp >> 8);
  481. file.WriteLine(CmdCode_To_CmdSave(0x751, 0x16, CmdCode));
  482. break;
  483. }
  484. case "[用户参数2]":
  485. {
  486. CmdCode[0] = 0x31;
  487. CmdCode[1] = 0x20;
  488. short DataTemp_Int16;
  489. ushort DataTemp_UInt16;
  490. sbyte DataTemp_Int8;
  491. //俯仰角零偏
  492. DataTemp_Int16 = (short)(decimal.Parse(arrText[rowNum + 1].ToString().Split(',')[1]) * 10);
  493. CmdCode[2] = (byte)(DataTemp_Int16 & 0xFF);
  494. CmdCode[3] = (byte)(DataTemp_Int16 >> 8);
  495. //横滚角零偏
  496. DataTemp_Int16 = (short)(decimal.Parse(arrText[rowNum + 2].ToString().Split(',')[1]) * 10);
  497. CmdCode[4] = (byte)(DataTemp_Int16 & 0xFF);
  498. CmdCode[5] = (byte)(DataTemp_Int16 >> 8);
  499. //支持姿态传感器
  500. CmdCode[6] = Convert.ToByte(arrText[rowNum + 3].ToString().Split(',')[1]);
  501. //尾灯模式
  502. CmdCode[7] = Convert.ToByte(arrText[rowNum + 4].ToString().Split(',')[1]);
  503. //前灯电压
  504. CmdCode[8] = Convert.ToByte(arrText[rowNum + 5].ToString().Split(',')[1]);
  505. //尾灯电压
  506. CmdCode[9] = Convert.ToByte(arrText[rowNum + 6].ToString().Split(',')[1]);
  507. //超速报警阈值
  508. DataTemp_UInt16 = Convert.ToUInt16(arrText[rowNum + 7].ToString().Split(',')[1]);
  509. CmdCode[10] = (byte)(DataTemp_UInt16 & 0xFF);
  510. CmdCode[11] = (byte)(DataTemp_UInt16 >> 8);
  511. //尾灯控制脉宽
  512. DataTemp_UInt16 = Convert.ToUInt16(arrText[rowNum + 8].ToString().Split(',')[1]);
  513. CmdCode[12] = (byte)(DataTemp_UInt16 & 0xFF);
  514. CmdCode[13] = (byte)(DataTemp_UInt16 >> 8);
  515. //尾灯控制周期
  516. DataTemp_UInt16 = Convert.ToUInt16(arrText[rowNum + 9].ToString().Split(',')[1]);
  517. CmdCode[14] = (byte)(DataTemp_UInt16 & 0xFF);
  518. CmdCode[15] = (byte)(DataTemp_UInt16 >> 8);
  519. //限速起始偏移
  520. DataTemp_Int8 = Convert.ToSByte(arrText[rowNum + 10].ToString().Split(',')[1]);
  521. CmdCode[16] = (byte)DataTemp_Int8;
  522. //限速起始偏移
  523. DataTemp_Int8 = Convert.ToSByte(arrText[rowNum + 11].ToString().Split(',')[1]);
  524. CmdCode[17] = (byte)DataTemp_Int8;
  525. //限速偏移
  526. DataTemp_Int8 = Convert.ToSByte(arrText[rowNum + 12].ToString().Split(',')[1]);
  527. CmdCode[18] = (byte)DataTemp_Int8;
  528. //预留
  529. CmdCode[19] = 0;
  530. //ECO最大力矩增益
  531. CmdCode[20] = Convert.ToByte(arrText[rowNum + 14].ToString().Split(',')[1]);
  532. //ECO最大电流增益
  533. CmdCode[21] = Convert.ToByte(arrText[rowNum + 15].ToString().Split(',')[1]);
  534. //NORM助力增益
  535. CmdCode[22] = Convert.ToByte(arrText[rowNum + 16].ToString().Split(',')[1]);
  536. //NORM加速
  537. CmdCode[23] = Convert.ToByte(arrText[rowNum + 17].ToString().Split(',')[1]);
  538. //SPORT助力增益
  539. CmdCode[24] = Convert.ToByte(arrText[rowNum + 18].ToString().Split(',')[1]);
  540. //SPORT加速
  541. CmdCode[25] = Convert.ToByte(arrText[rowNum + 19].ToString().Split(',')[1]);
  542. //TURBO助力增益
  543. CmdCode[26] = Convert.ToByte(arrText[rowNum + 20].ToString().Split(',')[1]);
  544. //TURBO加速
  545. CmdCode[27] = Convert.ToByte(arrText[rowNum + 21].ToString().Split(',')[1]);
  546. //SMART助力增益
  547. CmdCode[28] = Convert.ToByte(arrText[rowNum + 22].ToString().Split(',')[1]);
  548. //SMART加速
  549. CmdCode[29] = Convert.ToByte(arrText[rowNum + 23].ToString().Split(',')[1]);
  550. file.WriteLine(CmdCode_To_CmdSave(0x751, 0x16, CmdCode));
  551. break;
  552. }
  553. case "[三力矩标定系数1]":
  554. {
  555. CmdCode[0] = 0x34;
  556. CmdCode[1] = 0x02;
  557. CmdCode[2] = 0x01;
  558. ushort DataTemp;
  559. DataTemp = Convert.ToUInt16(arrText[rowNum + 1].ToString().Split(',')[1]);
  560. CmdCode[3] = (byte)DataTemp;
  561. file.WriteLine(CmdCode_To_CmdSave(0x751, 0x16, CmdCode));
  562. break;
  563. }
  564. case "[三力矩标定系数2]":
  565. {
  566. CmdCode[0] = 0x34;
  567. CmdCode[1] = 0x02;
  568. CmdCode[2] = 0x02;
  569. ushort DataTemp;
  570. DataTemp = Convert.ToUInt16(arrText[rowNum + 1].ToString().Split(',')[1]);
  571. CmdCode[3] = (byte)DataTemp;
  572. file.WriteLine(CmdCode_To_CmdSave(0x751, 0x16, CmdCode));
  573. break;
  574. }
  575. case "[三力矩标定系数3]":
  576. {
  577. CmdCode[0] = 0x34;
  578. CmdCode[1] = 0x02;
  579. CmdCode[2] = 0x03;
  580. ushort DataTemp;
  581. DataTemp = Convert.ToUInt16(arrText[rowNum + 1].ToString().Split(',')[1]);
  582. CmdCode[3] = (byte)DataTemp;
  583. file.WriteLine(CmdCode_To_CmdSave(0x751, 0x16, CmdCode));
  584. break;
  585. }
  586. default: break;
  587. }
  588. }
  589. }
  590. }
  591. }
  592. }
  593. catch (Exception e)
  594. {
  595. Console.WriteLine(e);
  596. Console.WriteLine("转换失败,输入任意键结束!");
  597. Console.ReadKey();
  598. return;
  599. }
  600. }
  601. else if (FuncionType == 2) //大牙盘
  602. {
  603. StreamReader objReader = new StreamReader(System.IO.Directory.GetCurrentDirectory() + "\\" + inputFilename + ".src");
  604. string sLine = "";
  605. ArrayList arrText = new ArrayList();//创建一个动态数组
  606. while (sLine != null)
  607. {
  608. sLine = objReader.ReadLine();
  609. arrText.Add(sLine);
  610. }
  611. objReader.Close();
  612. try
  613. {
  614. string filename = inputFilename + ".ttcfg";
  615. if (File.Exists(filename))//文件已存在,直接退出
  616. {
  617. Console.WriteLine("文件已存在!");
  618. Console.ReadKey();
  619. return;
  620. }
  621. else//文件名有效,转换后的数据存在该文件中
  622. {
  623. //创建文件
  624. FileStream fs = File.Create(filename);
  625. fs.Close();
  626. //建立字典,存放并获取每个命令的行号
  627. Dictionary<string, int> DicRowNum = new Dictionary<string, int>();
  628. DicRowNum.Add("[型号]", 0);
  629. DicRowNum.Add("[SN号]", 0);
  630. DicRowNum.Add("[校验码]", 0);
  631. DicRowNum.Add("[自定义1]", 0);
  632. DicRowNum.Add("[自定义2]", 0);
  633. DicRowNum.Add("[自定义3]", 0);
  634. DicRowNum.Add("[生产信息]", 0);
  635. DicRowNum.Add("[马达信息]", 0);
  636. DicRowNum.Add("[整车参数]", 0);
  637. DicRowNum.Add("[控制参数]", 0);
  638. DicRowNum.Add("[力矩传感器参数]", 0);
  639. DicRowNum.Add("[其它传感器参数]", 0);
  640. DicRowNum.Add("[助力参数]", 0);
  641. DicRowNum.Add("[调试参数]", 0);
  642. Dictionary<string, int> __dict = new Dictionary<string, int>(DicRowNum);
  643. foreach (KeyValuePair<string, int> item in __dict)
  644. {
  645. foreach (string cmd in arrText)
  646. {
  647. if (cmd.Contains(item.Key))
  648. {
  649. DicRowNum[item.Key] = arrText.IndexOf(cmd);
  650. break;
  651. }
  652. }
  653. }
  654. //开始遍历,转换每条指令对应的数据
  655. using (StreamWriter file = new StreamWriter(filename))
  656. {
  657. foreach (string index in DicRowNum.Keys)
  658. {
  659. int rowNum = DicRowNum[index];
  660. //判断该命令是否打开
  661. if (arrText[rowNum].ToString().Split(',')[1] == "0")//该指令关闭
  662. {
  663. continue;
  664. }
  665. else//该指令打开
  666. {
  667. //写入命令功能
  668. file.WriteLine(index);
  669. var CmdCode = new byte[100];
  670. Array.Clear(CmdCode, 0, CmdCode.Length);
  671. switch (index)
  672. {
  673. case "[型号]":
  674. {
  675. CmdCode[0] = 0x22;
  676. CmdCode[1] = 0x10;
  677. string ModeString = arrText[rowNum + 1].ToString().Split(',')[1];
  678. for (ushort i = 0; i < ((ModeString.Length > 16) ? 16 : ModeString.Length); i++)
  679. {
  680. CmdCode[2 + i] = (byte)ModeString[i];
  681. }
  682. //写入文件
  683. file.WriteLine(CmdCode_To_CmdSave(0x751, 0x16, CmdCode));
  684. break;
  685. }
  686. case "[SN号]":
  687. {
  688. CmdCode[0] = 0x23;
  689. CmdCode[1] = 0x10;
  690. string SnString = arrText[rowNum + 1].ToString().Split(',')[1];
  691. for (ushort i = 0; i < ((SnString.Length > 16) ? 16 : SnString.Length); i++)
  692. {
  693. CmdCode[2 + i] = (byte)SnString[i];
  694. }
  695. //写入文件
  696. file.WriteLine(CmdCode_To_CmdSave(0x751, 0x16, CmdCode));
  697. break;
  698. }
  699. case "[校验码]":
  700. {
  701. CmdCode[0] = 0x11;
  702. CmdCode[1] = 0x08;
  703. string KeyString = arrText[rowNum + 1].ToString().Split(',')[1];
  704. for (ushort i = 0; i < ((KeyString.Length > 8) ? 8 : KeyString.Length); i++)
  705. {
  706. CmdCode[2 + i] = (byte)KeyString[i];
  707. }
  708. //写入文件
  709. file.WriteLine(CmdCode_To_CmdSave(0x751, 0x16, CmdCode));
  710. break;
  711. }
  712. case "[自定义1]":
  713. {
  714. CmdCode[0] = 0x14;
  715. CmdCode[1] = 0x10;
  716. string UserInfo1String = arrText[rowNum + 1].ToString().Split(',')[1];
  717. for (ushort i = 0; i < ((UserInfo1String.Length > 16) ? 16 : UserInfo1String.Length); i++)
  718. {
  719. CmdCode[2 + i] = (byte)UserInfo1String[i];
  720. }
  721. //写入文件
  722. file.WriteLine(CmdCode_To_CmdSave(0x751, 0x16, CmdCode));
  723. break;
  724. }
  725. case "[自定义2]":
  726. {
  727. CmdCode[0] = 0x16;
  728. CmdCode[1] = 0x10;
  729. string UserInfo1String = arrText[rowNum + 1].ToString().Split(',')[1];
  730. for (ushort i = 0; i < ((UserInfo1String.Length > 16) ? 16 : UserInfo1String.Length); i++)
  731. {
  732. CmdCode[2 + i] = (byte)UserInfo1String[i];
  733. }
  734. //写入文件
  735. file.WriteLine(CmdCode_To_CmdSave(0x751, 0x16, CmdCode));
  736. break;
  737. }
  738. case "[自定义3]":
  739. {
  740. CmdCode[0] = 0x18;
  741. CmdCode[1] = 0x10;
  742. string UserInfo1String = arrText[rowNum + 1].ToString().Split(',')[1];
  743. for (ushort i = 0; i < ((UserInfo1String.Length > 16) ? 16 : UserInfo1String.Length); i++)
  744. {
  745. CmdCode[2 + i] = (byte)UserInfo1String[i];
  746. }
  747. //写入文件
  748. file.WriteLine(CmdCode_To_CmdSave(0x751, 0x16, CmdCode));
  749. break;
  750. }
  751. case "[生产信息]":
  752. {
  753. CmdCode[0] = 0x24;
  754. CmdCode[1] = 0x20;
  755. string MAC_Info = arrText[rowNum + 1].ToString().Split(',')[1];
  756. for (ushort i = 0; i < ((MAC_Info.Length > 8) ? 8 : MAC_Info.Length); i++)
  757. {
  758. CmdCode[2 + i] = (byte)MAC_Info[i];
  759. }
  760. MAC_Info = arrText[rowNum + 2].ToString().Split(',')[1];
  761. for (ushort i = 0; i < ((MAC_Info.Length > 8) ? 8 : MAC_Info.Length); i++)
  762. {
  763. CmdCode[10 + i] = (byte)MAC_Info[i];
  764. }
  765. MAC_Info = arrText[rowNum + 3].ToString().Split(',')[1];
  766. for (ushort i = 0; i < ((MAC_Info.Length > 8) ? 8 : MAC_Info.Length); i++)
  767. {
  768. CmdCode[18 + i] = (byte)MAC_Info[i];
  769. }
  770. MAC_Info = arrText[rowNum + 4].ToString().Split(',')[1];
  771. for (ushort i = 0; i < ((MAC_Info.Length > 8) ? 8 : MAC_Info.Length); i++)
  772. {
  773. CmdCode[26 + i] = (byte)MAC_Info[i];
  774. }
  775. //写入文件
  776. file.WriteLine(CmdCode_To_CmdSave(0x751, 0x16, CmdCode));
  777. break;
  778. }
  779. case "[马达信息]":
  780. {
  781. CmdCode[0] = 0x3B;
  782. CmdCode[1] = 0x28;
  783. ushort uDataTemp;
  784. short sDataTemp;
  785. //存储标志
  786. uDataTemp = Convert.ToUInt16(arrText[rowNum + 1].ToString().Split(',')[1]);
  787. CmdCode[2] = (byte)(uDataTemp & 0xFF);
  788. CmdCode[3] = (byte)(uDataTemp >> 8);
  789. //极对数
  790. uDataTemp = Convert.ToUInt16(arrText[rowNum + 2].ToString().Split(',')[1]);
  791. CmdCode[4] = (byte)(uDataTemp & 0xFF);
  792. CmdCode[5] = (byte)(uDataTemp >> 8);
  793. //电阻
  794. uDataTemp = Convert.ToUInt16(arrText[rowNum + 3].ToString().Split(',')[1]);
  795. CmdCode[6] = (byte)(uDataTemp & 0xFF);
  796. CmdCode[7] = (byte)(uDataTemp >> 8);
  797. //d轴电感
  798. uDataTemp = Convert.ToUInt16(arrText[rowNum + 4].ToString().Split(',')[1]);
  799. CmdCode[8] = (byte)(uDataTemp & 0xFF);
  800. CmdCode[9] = (byte)(uDataTemp >> 8);
  801. //q轴电感
  802. uDataTemp = Convert.ToUInt16(arrText[rowNum + 5].ToString().Split(',')[1]);
  803. CmdCode[10] = (byte)(uDataTemp & 0xFF);
  804. CmdCode[11] = (byte)(uDataTemp >> 8);
  805. //永磁体磁链
  806. uDataTemp = Convert.ToUInt16(arrText[rowNum + 6].ToString().Split(',')[1]);
  807. CmdCode[12] = (byte)(uDataTemp & 0xFF);
  808. CmdCode[13] = (byte)(uDataTemp >> 8);
  809. //Id最大值
  810. uDataTemp = Convert.ToUInt16(arrText[rowNum + 7].ToString().Split(',')[1]);
  811. CmdCode[14] = (byte)(uDataTemp & 0xFF);
  812. CmdCode[15] = (byte)(uDataTemp >> 8);
  813. //Id最小值
  814. sDataTemp = Convert.ToInt16(arrText[rowNum + 8].ToString().Split(',')[1]);
  815. CmdCode[16] = (byte)(sDataTemp & 0xFF);
  816. CmdCode[17] = (byte)(sDataTemp >> 8);
  817. //额定转速
  818. uDataTemp = Convert.ToUInt16(arrText[rowNum + 9].ToString().Split(',')[1]);
  819. CmdCode[18] = (byte)(uDataTemp & 0xFF);
  820. CmdCode[19] = (byte)(uDataTemp >> 8);
  821. //额定功率
  822. uDataTemp = Convert.ToUInt16(arrText[rowNum + 10].ToString().Split(',')[1]);
  823. CmdCode[20] = (byte)(uDataTemp & 0xFF);
  824. CmdCode[21] = (byte)(uDataTemp >> 8);
  825. //额定电流
  826. uDataTemp = Convert.ToUInt16(arrText[rowNum + 11].ToString().Split(',')[1]);
  827. CmdCode[22] = (byte)(uDataTemp & 0xFF);
  828. CmdCode[23] = (byte)(uDataTemp >> 8);
  829. //额定电压
  830. uDataTemp = Convert.ToUInt16(arrText[rowNum + 12].ToString().Split(',')[1]);
  831. CmdCode[24] = (byte)(uDataTemp & 0xFF);
  832. CmdCode[25] = (byte)(uDataTemp >> 8);
  833. //惯量
  834. uDataTemp = Convert.ToUInt16(arrText[rowNum + 13].ToString().Split(',')[1]);
  835. CmdCode[26] = (byte)(uDataTemp & 0xFF);
  836. CmdCode[27] = (byte)(uDataTemp >> 8);
  837. //最大转矩
  838. uDataTemp = Convert.ToUInt16(arrText[rowNum + 14].ToString().Split(',')[1]);
  839. CmdCode[28] = (byte)(uDataTemp & 0xFF);
  840. CmdCode[29] = (byte)(uDataTemp >> 8);
  841. //预留1
  842. uDataTemp = Convert.ToUInt16(arrText[rowNum + 15].ToString().Split(',')[1]);
  843. CmdCode[30] = (byte)(uDataTemp & 0xFF);
  844. CmdCode[31] = (byte)(uDataTemp >> 8);
  845. //预留2
  846. uDataTemp = Convert.ToUInt16(arrText[rowNum + 16].ToString().Split(',')[1]);
  847. CmdCode[32] = (byte)(uDataTemp & 0xFF);
  848. CmdCode[33] = (byte)(uDataTemp >> 8);
  849. //预留3
  850. uDataTemp = Convert.ToUInt16(arrText[rowNum + 17].ToString().Split(',')[1]);
  851. CmdCode[34] = (byte)(uDataTemp & 0xFF);
  852. CmdCode[35] = (byte)(uDataTemp >> 8);
  853. //预留4
  854. uDataTemp = Convert.ToUInt16(arrText[rowNum + 18].ToString().Split(',')[1]);
  855. CmdCode[36] = (byte)(uDataTemp & 0xFF);
  856. CmdCode[37] = (byte)(uDataTemp >> 8);
  857. //预留5
  858. uDataTemp = Convert.ToUInt16(arrText[rowNum + 19].ToString().Split(',')[1]);
  859. CmdCode[38] = (byte)(uDataTemp & 0xFF);
  860. CmdCode[39] = (byte)(uDataTemp >> 8);
  861. //预留6
  862. uDataTemp = Convert.ToUInt16(arrText[rowNum + 20].ToString().Split(',')[1]);
  863. CmdCode[40] = (byte)(uDataTemp & 0xFF);
  864. CmdCode[41] = (byte)(uDataTemp >> 8);
  865. //写入文件
  866. file.WriteLine(CmdCode_To_CmdSave(0x751, 0x16, CmdCode));
  867. break;
  868. }
  869. case "[整车参数]":
  870. {
  871. CmdCode[0] = 0x3D;
  872. CmdCode[1] = 0x1C;
  873. ushort uDataTemp;
  874. short sDataTemp;
  875. //存储标志
  876. uDataTemp = Convert.ToUInt16(arrText[rowNum + 1].ToString().Split(',')[1]);
  877. CmdCode[2] = (byte)(uDataTemp & 0xFF);
  878. CmdCode[3] = (byte)(uDataTemp >> 8);
  879. //轮胎周长
  880. uDataTemp = Convert.ToUInt16(arrText[rowNum + 2].ToString().Split(',')[1]);
  881. CmdCode[4] = (byte)(uDataTemp & 0xFF);
  882. CmdCode[5] = (byte)(uDataTemp >> 8);
  883. //电控传动比
  884. uDataTemp = Convert.ToUInt16(arrText[rowNum + 3].ToString().Split(',')[1]);
  885. CmdCode[6] = (byte)(uDataTemp & 0xFF);
  886. CmdCode[7] = (byte)(uDataTemp >> 8);
  887. //助力最大限速
  888. uDataTemp = Convert.ToUInt16(arrText[rowNum + 4].ToString().Split(',')[1]);
  889. CmdCode[8] = (byte)(uDataTemp & 0xFF);
  890. CmdCode[9] = (byte)(uDataTemp >> 8);
  891. //推行限速
  892. uDataTemp = Convert.ToUInt16(arrText[rowNum + 5].ToString().Split(',')[1]);
  893. CmdCode[10] = (byte)(uDataTemp & 0xFF);
  894. CmdCode[11] = (byte)(uDataTemp >> 8);
  895. //前牙盘
  896. uDataTemp = Convert.ToUInt16(arrText[rowNum + 6].ToString().Split(',')[1]);
  897. CmdCode[12] = (byte)(uDataTemp & 0xFF);
  898. CmdCode[13] = (byte)(uDataTemp >> 8);
  899. //后牙盘
  900. uDataTemp = Convert.ToUInt16(arrText[rowNum + 7].ToString().Split(',')[1]);
  901. CmdCode[14] = (byte)(uDataTemp & 0xFF);
  902. CmdCode[15] = (byte)(uDataTemp >> 8);
  903. //助力方案1
  904. uDataTemp = Convert.ToUInt16(arrText[rowNum + 8].ToString().Split(',')[1]);
  905. CmdCode[16] = (byte)(uDataTemp & 0xFF);
  906. CmdCode[17] = (byte)(uDataTemp >> 8);
  907. //助力方案2
  908. uDataTemp = Convert.ToUInt16(arrText[rowNum + 9].ToString().Split(',')[1]);
  909. CmdCode[18] = (byte)(uDataTemp & 0xFF);
  910. CmdCode[19] = (byte)(uDataTemp >> 8);
  911. //前后灯参数
  912. uDataTemp = Convert.ToUInt16(arrText[rowNum + 10].ToString().Split(',')[1]);
  913. CmdCode[20] = (byte)(uDataTemp & 0xFF);
  914. CmdCode[21] = (byte)(uDataTemp >> 8);
  915. //周长微调
  916. sDataTemp = Convert.ToInt16(arrText[rowNum + 11].ToString().Split(',')[1]);
  917. CmdCode[22] = (byte)(sDataTemp & 0xFF);
  918. CmdCode[23] = (byte)(sDataTemp >> 8);
  919. //启动模式
  920. uDataTemp = Convert.ToUInt16(arrText[rowNum + 12].ToString().Split(',')[1]);
  921. CmdCode[24] = (byte)(uDataTemp & 0xFF);
  922. CmdCode[25] = (byte)(uDataTemp >> 8);
  923. //开关机时间
  924. uDataTemp = Convert.ToUInt16(arrText[rowNum + 13].ToString().Split(',')[1]);
  925. CmdCode[26] = (byte)(uDataTemp & 0xFF);
  926. CmdCode[27] = (byte)(uDataTemp >> 8);
  927. //预留1
  928. uDataTemp = Convert.ToUInt16(arrText[rowNum + 14].ToString().Split(',')[1]);
  929. CmdCode[28] = (byte)(uDataTemp & 0xFF);
  930. CmdCode[29] = (byte)(uDataTemp >> 8);
  931. //写入文件
  932. file.WriteLine(CmdCode_To_CmdSave(0x751, 0x16, CmdCode));
  933. break;
  934. }
  935. case "[控制参数]":
  936. {
  937. CmdCode[0] = 0x3F;
  938. CmdCode[1] = 0x22;
  939. ushort uDataTemp;
  940. short sDataTemp;
  941. //存储标志
  942. uDataTemp = Convert.ToUInt16(arrText[rowNum + 1].ToString().Split(',')[1]);
  943. CmdCode[2] = (byte)(uDataTemp & 0xFF);
  944. CmdCode[3] = (byte)(uDataTemp >> 8);
  945. //位置传感器零点
  946. uDataTemp = Convert.ToUInt16(arrText[rowNum + 2].ToString().Split(',')[1]);
  947. CmdCode[4] = (byte)(uDataTemp & 0xFF);
  948. CmdCode[5] = (byte)(uDataTemp >> 8);
  949. //位置传感器当前零点
  950. uDataTemp = Convert.ToUInt16(arrText[rowNum + 3].ToString().Split(',')[1]);
  951. CmdCode[6] = (byte)(uDataTemp & 0xFF);
  952. CmdCode[7] = (byte)(uDataTemp >> 8);
  953. //峰值电流
  954. uDataTemp = Convert.ToUInt16(arrText[rowNum + 4].ToString().Split(',')[1]);
  955. CmdCode[8] = (byte)(uDataTemp & 0xFF);
  956. CmdCode[9] = (byte)(uDataTemp >> 8);
  957. //过流保护阈值
  958. uDataTemp = Convert.ToUInt16(arrText[rowNum + 5].ToString().Split(',')[1]);
  959. CmdCode[10] = (byte)(uDataTemp & 0xFF);
  960. CmdCode[11] = (byte)(uDataTemp >> 8);
  961. //最高档过压保护阈值
  962. uDataTemp = Convert.ToUInt16(arrText[rowNum + 6].ToString().Split(',')[1]);
  963. CmdCode[12] = (byte)(uDataTemp & 0xFF);
  964. CmdCode[13] = (byte)(uDataTemp >> 8);
  965. //最高档欠压保护阈值
  966. uDataTemp = Convert.ToUInt16(arrText[rowNum + 7].ToString().Split(',')[1]);
  967. CmdCode[14] = (byte)(uDataTemp & 0xFF);
  968. CmdCode[15] = (byte)(uDataTemp >> 8);
  969. //超速保护阈值
  970. uDataTemp = Convert.ToUInt16(arrText[rowNum + 8].ToString().Split(',')[1]);
  971. CmdCode[16] = (byte)(uDataTemp & 0xFF);
  972. CmdCode[17] = (byte)(uDataTemp >> 8);
  973. //控制器过热保护阈值
  974. uDataTemp = Convert.ToUInt16(arrText[rowNum + 9].ToString().Split(',')[1]);
  975. CmdCode[18] = (byte)(uDataTemp & 0xFF);
  976. CmdCode[19] = (byte)(uDataTemp >> 8);
  977. //控制器过热恢复阈值
  978. uDataTemp = Convert.ToUInt16(arrText[rowNum + 10].ToString().Split(',')[1]);
  979. CmdCode[20] = (byte)(uDataTemp & 0xFF);
  980. CmdCode[21] = (byte)(uDataTemp >> 8);
  981. //控制器过热降额阈值
  982. sDataTemp = Convert.ToInt16(arrText[rowNum + 11].ToString().Split(',')[1]);
  983. CmdCode[22] = (byte)(sDataTemp & 0xFF);
  984. CmdCode[23] = (byte)(sDataTemp >> 8);
  985. //电机过热保护阈值
  986. uDataTemp = Convert.ToUInt16(arrText[rowNum + 12].ToString().Split(',')[1]);
  987. CmdCode[24] = (byte)(uDataTemp & 0xFF);
  988. CmdCode[25] = (byte)(uDataTemp >> 8);
  989. //电机过热恢复阈值
  990. uDataTemp = Convert.ToUInt16(arrText[rowNum + 13].ToString().Split(',')[1]);
  991. CmdCode[26] = (byte)(uDataTemp & 0xFF);
  992. CmdCode[27] = (byte)(uDataTemp >> 8);
  993. //电机过热降额阈值
  994. uDataTemp = Convert.ToUInt16(arrText[rowNum + 14].ToString().Split(',')[1]);
  995. CmdCode[28] = (byte)(uDataTemp & 0xFF);
  996. CmdCode[29] = (byte)(uDataTemp >> 8);
  997. //预留1
  998. uDataTemp = Convert.ToUInt16(arrText[rowNum + 15].ToString().Split(',')[1]);
  999. CmdCode[30] = (byte)(uDataTemp & 0xFF);
  1000. CmdCode[31] = (byte)(uDataTemp >> 8);
  1001. //预留2
  1002. uDataTemp = Convert.ToUInt16(arrText[rowNum + 16].ToString().Split(',')[1]);
  1003. CmdCode[32] = (byte)(uDataTemp & 0xFF);
  1004. CmdCode[33] = (byte)(uDataTemp >> 8);
  1005. //预留3
  1006. uDataTemp = Convert.ToUInt16(arrText[rowNum + 17].ToString().Split(',')[1]);
  1007. CmdCode[34] = (byte)(uDataTemp & 0xFF);
  1008. CmdCode[35] = (byte)(uDataTemp >> 8);
  1009. //写入文件
  1010. file.WriteLine(CmdCode_To_CmdSave(0x751, 0x16, CmdCode));
  1011. break;
  1012. }
  1013. case "[力矩传感器参数]":
  1014. {
  1015. CmdCode[0] = 0x47;
  1016. CmdCode[1] = 0x2E;
  1017. ushort uDataTemp;
  1018. short sDataTemp;
  1019. //存储标志
  1020. uDataTemp = Convert.ToUInt16(arrText[rowNum + 1].ToString().Split(',')[1]);
  1021. CmdCode[2] = (byte)(uDataTemp & 0xFF);
  1022. CmdCode[3] = (byte)(uDataTemp >> 8);
  1023. //出厂零点
  1024. uDataTemp = Convert.ToUInt16(arrText[rowNum + 2].ToString().Split(',')[1]);
  1025. CmdCode[4] = (byte)(uDataTemp & 0xFF);
  1026. CmdCode[5] = (byte)(uDataTemp >> 8);
  1027. //历史零点1
  1028. uDataTemp = Convert.ToUInt16(arrText[rowNum + 3].ToString().Split(',')[1]);
  1029. CmdCode[6] = (byte)(uDataTemp & 0xFF);
  1030. CmdCode[7] = (byte)(uDataTemp >> 8);
  1031. //历史零点2
  1032. uDataTemp = Convert.ToUInt16(arrText[rowNum + 4].ToString().Split(',')[1]);
  1033. CmdCode[8] = (byte)(uDataTemp & 0xFF);
  1034. CmdCode[9] = (byte)(uDataTemp >> 8);
  1035. //历史零点3
  1036. uDataTemp = Convert.ToUInt16(arrText[rowNum + 5].ToString().Split(',')[1]);
  1037. CmdCode[10] = (byte)(uDataTemp & 0xFF);
  1038. CmdCode[11] = (byte)(uDataTemp >> 8);
  1039. //最大零点
  1040. uDataTemp = Convert.ToUInt16(arrText[rowNum + 6].ToString().Split(',')[1]);
  1041. CmdCode[12] = (byte)(uDataTemp & 0xFF);
  1042. CmdCode[13] = (byte)(uDataTemp >> 8);
  1043. //最大转矩
  1044. uDataTemp = Convert.ToUInt16(arrText[rowNum + 7].ToString().Split(',')[1]);
  1045. CmdCode[14] = (byte)(uDataTemp & 0xFF);
  1046. CmdCode[15] = (byte)(uDataTemp >> 8);
  1047. //第一阶段加载值
  1048. uDataTemp = Convert.ToUInt16(arrText[rowNum + 8].ToString().Split(',')[1]);
  1049. CmdCode[16] = (byte)(uDataTemp & 0xFF);
  1050. CmdCode[17] = (byte)(uDataTemp >> 8);
  1051. //第一阶段采集值
  1052. uDataTemp = Convert.ToUInt16(arrText[rowNum + 9].ToString().Split(',')[1]);
  1053. CmdCode[18] = (byte)(uDataTemp & 0xFF);
  1054. CmdCode[19] = (byte)(uDataTemp >> 8);
  1055. //第二阶段加载值
  1056. uDataTemp = Convert.ToUInt16(arrText[rowNum + 10].ToString().Split(',')[1]);
  1057. CmdCode[20] = (byte)(uDataTemp & 0xFF);
  1058. CmdCode[21] = (byte)(uDataTemp >> 8);
  1059. //第二阶段采集值
  1060. uDataTemp = Convert.ToUInt16(arrText[rowNum + 11].ToString().Split(',')[1]);
  1061. CmdCode[22] = (byte)(uDataTemp & 0xFF);
  1062. CmdCode[23] = (byte)(uDataTemp >> 8);
  1063. //第三阶段加载值
  1064. uDataTemp = Convert.ToUInt16(arrText[rowNum + 12].ToString().Split(',')[1]);
  1065. CmdCode[24] = (byte)(uDataTemp & 0xFF);
  1066. CmdCode[25] = (byte)(uDataTemp >> 8);
  1067. //第三阶段采集值
  1068. uDataTemp = Convert.ToUInt16(arrText[rowNum + 13].ToString().Split(',')[1]);
  1069. CmdCode[26] = (byte)(uDataTemp & 0xFF);
  1070. CmdCode[27] = (byte)(uDataTemp >> 8);
  1071. //第四阶段加载值
  1072. uDataTemp = Convert.ToUInt16(arrText[rowNum + 14].ToString().Split(',')[1]);
  1073. CmdCode[28] = (byte)(uDataTemp & 0xFF);
  1074. CmdCode[29] = (byte)(uDataTemp >> 8);
  1075. //第四阶段采集值
  1076. uDataTemp = Convert.ToUInt16(arrText[rowNum + 15].ToString().Split(',')[1]);
  1077. CmdCode[30] = (byte)(uDataTemp & 0xFF);
  1078. CmdCode[31] = (byte)(uDataTemp >> 8);
  1079. //写入文件
  1080. file.WriteLine(CmdCode_To_CmdSave(0x751, 0x16, CmdCode));
  1081. break;
  1082. }
  1083. case "[其它传感器参数]":
  1084. {
  1085. CmdCode[0] = 0x42;
  1086. CmdCode[1] = 0x0E;
  1087. ushort uDataTemp;
  1088. short sDataTemp;
  1089. //存储标志
  1090. uDataTemp = Convert.ToUInt16(arrText[rowNum + 1].ToString().Split(',')[1]);
  1091. CmdCode[2] = (byte)(uDataTemp & 0xFF);
  1092. CmdCode[3] = (byte)(uDataTemp >> 8);
  1093. //踏频一圈脉冲数
  1094. uDataTemp = Convert.ToUInt16(arrText[rowNum + 2].ToString().Split(',')[1]);
  1095. CmdCode[4] = (byte)(uDataTemp & 0xFF);
  1096. CmdCode[5] = (byte)(uDataTemp >> 8);
  1097. //车速一圈脉冲数
  1098. uDataTemp = Convert.ToUInt16(arrText[rowNum + 3].ToString().Split(',')[1]);
  1099. CmdCode[6] = (byte)(uDataTemp & 0xFF);
  1100. CmdCode[7] = (byte)(uDataTemp >> 8);
  1101. //写入文件
  1102. file.WriteLine(CmdCode_To_CmdSave(0x751, 0x16, CmdCode));
  1103. break;
  1104. }
  1105. case "[助力参数]":
  1106. {
  1107. CmdCode[0] = 0x44;
  1108. CmdCode[1] = 0x50;
  1109. ushort uDataTemp;
  1110. short sDataTemp;
  1111. //存储标志
  1112. uDataTemp = Convert.ToUInt16(arrText[rowNum + 1].ToString().Split(',')[1]);
  1113. CmdCode[2] = (byte)(uDataTemp & 0xFF);
  1114. CmdCode[3] = (byte)(uDataTemp >> 8);
  1115. //空
  1116. uDataTemp = Convert.ToUInt16(arrText[rowNum + 2].ToString().Split(',')[1]);
  1117. CmdCode[4] = (byte)(uDataTemp & 0xFF);
  1118. CmdCode[5] = (byte)(uDataTemp >> 8);
  1119. //零速启动增益
  1120. uDataTemp = Convert.ToUInt16(arrText[rowNum + 3].ToString().Split(',')[1]);
  1121. CmdCode[6] = (byte)(uDataTemp & 0xFF);
  1122. CmdCode[7] = (byte)(uDataTemp >> 8);
  1123. //巡航启动增益
  1124. uDataTemp = Convert.ToUInt16(arrText[rowNum + 4].ToString().Split(',')[1]);
  1125. CmdCode[8] = (byte)(uDataTemp & 0xFF);
  1126. CmdCode[9] = (byte)(uDataTemp >> 8);
  1127. //助力启动阈值
  1128. uDataTemp = Convert.ToUInt16(arrText[rowNum + 85].ToString().Split(',')[1]);
  1129. CmdCode[46] = (byte)(uDataTemp & 0xFF);
  1130. CmdCode[47] = (byte)(uDataTemp >> 8);
  1131. //助力停止阈值
  1132. uDataTemp = Convert.ToUInt16(arrText[rowNum + 86].ToString().Split(',')[1]);
  1133. CmdCode[48] = (byte)(uDataTemp & 0xFF);
  1134. CmdCode[49] = (byte)(uDataTemp >> 8);
  1135. //启动时电流增长阶梯
  1136. uDataTemp = Convert.ToUInt16(arrText[rowNum + 87].ToString().Split(',')[1]);
  1137. CmdCode[50] = (byte)(uDataTemp & 0xFF);
  1138. CmdCode[51] = (byte)(uDataTemp >> 8);
  1139. //启动踏频脉冲数
  1140. uDataTemp = Convert.ToUInt16(arrText[rowNum + 88].ToString().Split(',')[1]);
  1141. CmdCode[52] = (byte)(uDataTemp & 0xFF);
  1142. CmdCode[53] = (byte)(uDataTemp >> 8);
  1143. //转矩滤波脉冲数
  1144. uDataTemp = Convert.ToUInt16(arrText[rowNum + 89].ToString().Split(',')[1]);
  1145. CmdCode[54] = (byte)(uDataTemp & 0xFF);
  1146. CmdCode[55] = (byte)(uDataTemp >> 8);
  1147. //待速转速
  1148. uDataTemp = Convert.ToUInt16(arrText[rowNum + 90].ToString().Split(',')[1]);
  1149. CmdCode[56] = (byte)(uDataTemp & 0xFF);
  1150. CmdCode[57] = (byte)(uDataTemp >> 8);
  1151. //待速最大电流
  1152. uDataTemp = Convert.ToUInt16(arrText[rowNum + 91].ToString().Split(',')[1]);
  1153. CmdCode[58] = (byte)(uDataTemp & 0xFF);
  1154. CmdCode[59] = (byte)(uDataTemp >> 8);
  1155. //限速启动阈值
  1156. uDataTemp = Convert.ToUInt16(arrText[rowNum + 92].ToString().Split(',')[1]);
  1157. CmdCode[60] = (byte)(uDataTemp & 0xFF);
  1158. CmdCode[61] = (byte)(uDataTemp >> 8);
  1159. //限速停止阈值
  1160. uDataTemp = Convert.ToUInt16(arrText[rowNum + 93].ToString().Split(',')[1]);
  1161. CmdCode[62] = (byte)(uDataTemp & 0xFF);
  1162. CmdCode[63] = (byte)(uDataTemp >> 8);
  1163. //踏频占比
  1164. uDataTemp = Convert.ToUInt16(arrText[rowNum + 94].ToString().Split(',')[1]);
  1165. CmdCode[64] = (byte)(uDataTemp & 0xFF);
  1166. CmdCode[65] = (byte)(uDataTemp >> 8);
  1167. //踏频助力Kp
  1168. uDataTemp = Convert.ToUInt16(arrText[rowNum + 95].ToString().Split(',')[1]);
  1169. CmdCode[66] = (byte)(uDataTemp & 0xFF);
  1170. CmdCode[67] = (byte)(uDataTemp >> 8);
  1171. //踏频助力加速限制
  1172. sDataTemp = Convert.ToInt16(arrText[rowNum + 96].ToString().Split(',')[1]);
  1173. CmdCode[68] = (byte)(sDataTemp & 0xFF);
  1174. CmdCode[69] = (byte)(sDataTemp >> 8);
  1175. //踏频助力退饱和步进
  1176. sDataTemp = Convert.ToInt16(arrText[rowNum + 97].ToString().Split(',')[1]);
  1177. CmdCode[70] = (byte)(sDataTemp & 0xFF);
  1178. CmdCode[71] = (byte)(sDataTemp >> 8);
  1179. //踏频助力电流步进
  1180. sDataTemp = Convert.ToInt16(arrText[rowNum + 98].ToString().Split(',')[1]);
  1181. CmdCode[72] = (byte)(sDataTemp & 0xFF);
  1182. CmdCode[73] = (byte)(sDataTemp >> 8);
  1183. //预留1
  1184. uDataTemp = Convert.ToUInt16(arrText[rowNum + 99].ToString().Split(',')[1]);
  1185. CmdCode[74] = (byte)(uDataTemp & 0xFF);
  1186. CmdCode[75] = (byte)(uDataTemp >> 8);
  1187. //预留2
  1188. uDataTemp = Convert.ToUInt16(arrText[rowNum + 100].ToString().Split(',')[1]);
  1189. CmdCode[76] = (byte)(uDataTemp & 0xFF);
  1190. CmdCode[77] = (byte)(uDataTemp >> 8);
  1191. //预留3
  1192. uDataTemp = Convert.ToUInt16(arrText[rowNum + 101].ToString().Split(',')[1]);
  1193. CmdCode[78] = (byte)(uDataTemp & 0xFF);
  1194. CmdCode[79] = (byte)(uDataTemp >> 8);
  1195. //预留4
  1196. uDataTemp = Convert.ToUInt16(arrText[rowNum + 102].ToString().Split(',')[1]);
  1197. CmdCode[80] = (byte)(uDataTemp & 0xFF);
  1198. CmdCode[81] = (byte)(uDataTemp >> 8);
  1199. //转矩曲线1-15,踏频曲线1-5,按照前5条同时写力矩和踏频,后9条写力矩和踏频5
  1200. for (ushort i = 1; i <= 15; i++)
  1201. {
  1202. Int32 Data32;
  1203. //转矩曲线编号
  1204. uDataTemp = (ushort)(i);
  1205. CmdCode[10] = (byte)(uDataTemp & 0xFF);
  1206. CmdCode[11] = (byte)(uDataTemp >> 8);
  1207. //踏频曲线编号
  1208. uDataTemp = (ushort)(i <= 5 ? i : 5);
  1209. CmdCode[12] = (byte)(uDataTemp & 0xFF);
  1210. CmdCode[13] = (byte)(uDataTemp >> 8);
  1211. //转矩曲线a
  1212. Data32 = Convert.ToInt32(arrText[rowNum + (4 * i + 1)].ToString().Split(',')[1]);
  1213. CmdCode[14] = (byte)(Data32 & 0xFF);
  1214. CmdCode[15] = (byte)(Data32 >> 8);
  1215. CmdCode[16] = (byte)(Data32 >> 16);
  1216. CmdCode[17] = (byte)(Data32 >> 24);
  1217. //转矩曲线b
  1218. Data32 = Convert.ToInt32(arrText[rowNum + (4 * i + 2)].ToString().Split(',')[1]);
  1219. CmdCode[18] = (byte)(Data32 & 0xFF);
  1220. CmdCode[19] = (byte)(Data32 >> 8);
  1221. CmdCode[20] = (byte)(Data32 >> 16);
  1222. CmdCode[21] = (byte)(Data32 >> 24);
  1223. //转矩曲线c
  1224. Data32 = Convert.ToInt32(arrText[rowNum + (4 * i + 3)].ToString().Split(',')[1]);
  1225. CmdCode[22] = (byte)(Data32 & 0xFF);
  1226. CmdCode[23] = (byte)(Data32 >> 8);
  1227. CmdCode[24] = (byte)(Data32 >> 16);
  1228. CmdCode[25] = (byte)(Data32 >> 24);
  1229. //转矩曲线d
  1230. Data32 = Convert.ToInt32(arrText[rowNum + (4 * i + 4)].ToString().Split(',')[1]);
  1231. CmdCode[26] = (byte)(Data32 & 0xFF);
  1232. CmdCode[27] = (byte)(Data32 >> 8);
  1233. CmdCode[28] = (byte)(Data32 >> 16);
  1234. CmdCode[29] = (byte)(Data32 >> 24);
  1235. if (i <= 5)
  1236. {
  1237. //踏频曲线a
  1238. Data32 = Convert.ToInt32(arrText[rowNum + (4 * i + 61)].ToString().Split(',')[1]);
  1239. CmdCode[30] = (byte)(Data32 & 0xFF);
  1240. CmdCode[31] = (byte)(Data32 >> 8);
  1241. CmdCode[32] = (byte)(Data32 >> 16);
  1242. CmdCode[33] = (byte)(Data32 >> 24);
  1243. //踏频曲线b
  1244. Data32 = Convert.ToInt32(arrText[rowNum + (4 * i + 62)].ToString().Split(',')[1]);
  1245. CmdCode[34] = (byte)(Data32 & 0xFF);
  1246. CmdCode[35] = (byte)(Data32 >> 8);
  1247. CmdCode[36] = (byte)(Data32 >> 16);
  1248. CmdCode[37] = (byte)(Data32 >> 24);
  1249. //踏频曲线c
  1250. Data32 = Convert.ToInt32(arrText[rowNum + (4 * i + 63)].ToString().Split(',')[1]);
  1251. CmdCode[38] = (byte)(Data32 & 0xFF);
  1252. CmdCode[39] = (byte)(Data32 >> 8);
  1253. CmdCode[40] = (byte)(Data32 >> 16);
  1254. CmdCode[41] = (byte)(Data32 >> 24);
  1255. //踏频曲线d
  1256. Data32 = Convert.ToInt32(arrText[rowNum + (4 * i + 64)].ToString().Split(',')[1]);
  1257. CmdCode[42] = (byte)(Data32 & 0xFF);
  1258. CmdCode[43] = (byte)(Data32 >> 8);
  1259. CmdCode[44] = (byte)(Data32 >> 16);
  1260. CmdCode[45] = (byte)(Data32 >> 24);
  1261. }
  1262. //写入文件
  1263. file.WriteLine("[曲线" + i.ToString() + "]");
  1264. file.WriteLine(CmdCode_To_CmdSave(0x751, 0x16, CmdCode));
  1265. }
  1266. break;
  1267. }
  1268. case "[调试参数]":
  1269. {
  1270. CmdCode[0] = 0x46;
  1271. CmdCode[1] = 0x3C;
  1272. ushort uDataTemp;
  1273. short sDataTemp;
  1274. //存储标志
  1275. uDataTemp = Convert.ToUInt16(arrText[rowNum + 1].ToString().Split(',')[1]);
  1276. CmdCode[2] = (byte)(uDataTemp & 0xFF);
  1277. CmdCode[3] = (byte)(uDataTemp >> 8);
  1278. //运行模式
  1279. uDataTemp = Convert.ToUInt16(arrText[rowNum + 2].ToString().Split(',')[1]);
  1280. CmdCode[4] = (byte)(uDataTemp & 0xFF);
  1281. CmdCode[5] = (byte)(uDataTemp >> 8);
  1282. //位置获取模式
  1283. uDataTemp = Convert.ToUInt16(arrText[rowNum + 3].ToString().Split(',')[1]);
  1284. CmdCode[6] = (byte)(uDataTemp & 0xFF);
  1285. CmdCode[7] = (byte)(uDataTemp >> 8);
  1286. //采样模式
  1287. uDataTemp = Convert.ToUInt16(arrText[rowNum + 4].ToString().Split(',')[1]);
  1288. CmdCode[8] = (byte)(uDataTemp & 0xFF);
  1289. CmdCode[9] = (byte)(uDataTemp >> 8);
  1290. //旋转方向
  1291. uDataTemp = Convert.ToUInt16(arrText[rowNum + 5].ToString().Split(',')[1]);
  1292. CmdCode[10] = (byte)(uDataTemp & 0xFF);
  1293. CmdCode[11] = (byte)(uDataTemp >> 8);
  1294. //定位电流
  1295. uDataTemp = Convert.ToUInt16(arrText[rowNum + 6].ToString().Split(',')[1]);
  1296. CmdCode[12] = (byte)(uDataTemp & 0xFF);
  1297. CmdCode[13] = (byte)(uDataTemp >> 8);
  1298. //拖拽电压
  1299. uDataTemp = Convert.ToUInt16(arrText[rowNum + 7].ToString().Split(',')[1]);
  1300. CmdCode[14] = (byte)(uDataTemp & 0xFF);
  1301. CmdCode[15] = (byte)(uDataTemp >> 8);
  1302. //拖拽电流
  1303. uDataTemp = Convert.ToUInt16(arrText[rowNum + 8].ToString().Split(',')[1]);
  1304. CmdCode[16] = (byte)(uDataTemp & 0xFF);
  1305. CmdCode[17] = (byte)(uDataTemp >> 8);
  1306. //拖拽频率
  1307. uDataTemp = Convert.ToUInt16(arrText[rowNum + 9].ToString().Split(',')[1]);
  1308. CmdCode[18] = (byte)(uDataTemp & 0xFF);
  1309. CmdCode[19] = (byte)(uDataTemp >> 8);
  1310. //加速斜率
  1311. uDataTemp = Convert.ToUInt16(arrText[rowNum + 10].ToString().Split(',')[1]);
  1312. CmdCode[20] = (byte)(uDataTemp & 0xFF);
  1313. CmdCode[21] = (byte)(uDataTemp >> 8);
  1314. //减速斜率
  1315. sDataTemp = Convert.ToInt16(arrText[rowNum + 11].ToString().Split(',')[1]);
  1316. CmdCode[22] = (byte)(sDataTemp & 0xFF);
  1317. CmdCode[23] = (byte)(sDataTemp >> 8);
  1318. //转速环控制带宽
  1319. uDataTemp = Convert.ToUInt16(arrText[rowNum + 12].ToString().Split(',')[1]);
  1320. CmdCode[24] = (byte)(uDataTemp & 0xFF);
  1321. CmdCode[25] = (byte)(uDataTemp >> 8);
  1322. //转速环控制m
  1323. uDataTemp = Convert.ToUInt16(arrText[rowNum + 13].ToString().Split(',')[1]);
  1324. CmdCode[26] = (byte)(uDataTemp & 0xFF);
  1325. CmdCode[27] = (byte)(uDataTemp >> 8);
  1326. //电流环控制带宽
  1327. uDataTemp = Convert.ToUInt16(arrText[rowNum + 14].ToString().Split(',')[1]);
  1328. CmdCode[28] = (byte)(uDataTemp & 0xFF);
  1329. CmdCode[29] = (byte)(uDataTemp >> 8);
  1330. //电流环控制m
  1331. uDataTemp = Convert.ToUInt16(arrText[rowNum + 15].ToString().Split(',')[1]);
  1332. CmdCode[30] = (byte)(uDataTemp & 0xFF);
  1333. CmdCode[31] = (byte)(uDataTemp >> 8);
  1334. //磁链观测器带宽
  1335. uDataTemp = Convert.ToUInt16(arrText[rowNum + 16].ToString().Split(',')[1]);
  1336. CmdCode[32] = (byte)(uDataTemp & 0xFF);
  1337. CmdCode[33] = (byte)(uDataTemp >> 8);
  1338. //磁链观测器m
  1339. uDataTemp = Convert.ToUInt16(arrText[rowNum + 17].ToString().Split(',')[1]);
  1340. CmdCode[34] = (byte)(uDataTemp & 0xFF);
  1341. CmdCode[35] = (byte)(uDataTemp >> 8);
  1342. //锁相环带宽
  1343. uDataTemp = Convert.ToUInt16(arrText[rowNum + 18].ToString().Split(',')[1]);
  1344. CmdCode[36] = (byte)(uDataTemp & 0xFF);
  1345. CmdCode[37] = (byte)(uDataTemp >> 8);
  1346. //锁相环m
  1347. uDataTemp = Convert.ToUInt16(arrText[rowNum + 19].ToString().Split(',')[1]);
  1348. CmdCode[38] = (byte)(uDataTemp & 0xFF);
  1349. CmdCode[39] = (byte)(uDataTemp >> 8);
  1350. //惯量
  1351. uDataTemp = Convert.ToUInt16(arrText[rowNum + 20].ToString().Split(',')[1]);
  1352. CmdCode[40] = (byte)(uDataTemp & 0xFF);
  1353. CmdCode[41] = (byte)(uDataTemp >> 8);
  1354. //PWM最大占空比
  1355. uDataTemp = Convert.ToUInt16(arrText[rowNum + 21].ToString().Split(',')[1]);
  1356. CmdCode[42] = (byte)(uDataTemp & 0xFF);
  1357. CmdCode[43] = (byte)(uDataTemp >> 8);
  1358. //PWM七段式切五段式阈值
  1359. uDataTemp = Convert.ToUInt16(arrText[rowNum + 22].ToString().Split(',')[1]);
  1360. CmdCode[44] = (byte)(uDataTemp & 0xFF);
  1361. CmdCode[45] = (byte)(uDataTemp >> 8);
  1362. //功率限幅
  1363. uDataTemp = Convert.ToUInt16(arrText[rowNum + 23].ToString().Split(',')[1]);
  1364. CmdCode[46] = (byte)(uDataTemp & 0xFF);
  1365. CmdCode[47] = (byte)(uDataTemp >> 8);
  1366. //功率限幅Error
  1367. uDataTemp = Convert.ToUInt16(arrText[rowNum + 24].ToString().Split(',')[1]);
  1368. CmdCode[48] = (byte)(uDataTemp & 0xFF);
  1369. CmdCode[49] = (byte)(uDataTemp >> 8);
  1370. //功率限幅Kp
  1371. uDataTemp = Convert.ToUInt16(arrText[rowNum + 25].ToString().Split(',')[1]);
  1372. CmdCode[50] = (byte)(uDataTemp & 0xFF);
  1373. CmdCode[51] = (byte)(uDataTemp >> 8);
  1374. //功率限幅Ki
  1375. uDataTemp = Convert.ToUInt16(arrText[rowNum + 26].ToString().Split(',')[1]);
  1376. CmdCode[52] = (byte)(uDataTemp & 0xFF);
  1377. CmdCode[53] = (byte)(uDataTemp >> 8);
  1378. //预留1
  1379. uDataTemp = Convert.ToUInt16(arrText[rowNum + 27].ToString().Split(',')[1]);
  1380. CmdCode[54] = (byte)(uDataTemp & 0xFF);
  1381. CmdCode[55] = (byte)(uDataTemp >> 8);
  1382. //预留2
  1383. uDataTemp = Convert.ToUInt16(arrText[rowNum + 28].ToString().Split(',')[1]);
  1384. CmdCode[56] = (byte)(uDataTemp & 0xFF);
  1385. CmdCode[57] = (byte)(uDataTemp >> 8);
  1386. //预留3
  1387. uDataTemp = Convert.ToUInt16(arrText[rowNum + 29].ToString().Split(',')[1]);
  1388. CmdCode[58] = (byte)(uDataTemp & 0xFF);
  1389. CmdCode[59] = (byte)(uDataTemp >> 8);
  1390. //预留4
  1391. uDataTemp = Convert.ToUInt16(arrText[rowNum + 30].ToString().Split(',')[1]);
  1392. CmdCode[60] = (byte)(uDataTemp & 0xFF);
  1393. CmdCode[61] = (byte)(uDataTemp >> 8);
  1394. //写入文件
  1395. file.WriteLine(CmdCode_To_CmdSave(0x751, 0x16, CmdCode));
  1396. break;
  1397. }
  1398. default: break;
  1399. }
  1400. }
  1401. }
  1402. //写入关机指令
  1403. file.WriteLine("[关机指令]");
  1404. var CmdCode1 = new byte[100];
  1405. CmdCode1[0] = 0x25;
  1406. CmdCode1[1] = 0x05;
  1407. CmdCode1[2] = System.Text.Encoding.Default.GetBytes("OFF..")[0];
  1408. CmdCode1[3] = System.Text.Encoding.Default.GetBytes("OFF..")[1];
  1409. CmdCode1[4] = System.Text.Encoding.Default.GetBytes("OFF..")[2];
  1410. CmdCode1[5] = System.Text.Encoding.Default.GetBytes("OFF..")[3];
  1411. CmdCode1[6] = System.Text.Encoding.Default.GetBytes("OFF..")[4];
  1412. file.WriteLine(CmdCode_To_CmdSave(0x751, 0x16, CmdCode1));
  1413. }
  1414. }
  1415. }
  1416. catch (Exception e)
  1417. {
  1418. Console.WriteLine(e);
  1419. Console.WriteLine("转换失败,输入任意键结束!");
  1420. Console.ReadKey();
  1421. return;
  1422. }
  1423. }
  1424. else if (FuncionType == 3)
  1425. {
  1426. //读取转换源数据
  1427. string SrcInfo = File.ReadAllText(System.IO.Directory.GetCurrentDirectory() + "\\" + inputFilename + ".json");
  1428. CommandInfo Command = JsonConvert.DeserializeObject<CommandInfo>(SrcInfo);
  1429. //转换保存文件
  1430. string filename = inputFilename + ".ttcfg";
  1431. if (File.Exists(filename))//文件已存在,直接退出
  1432. {
  1433. Console.WriteLine("文件已存在!");
  1434. Console.ReadKey();
  1435. return;
  1436. }
  1437. else//文件名有效,转换后的数据存在该文件中
  1438. {
  1439. //创建文件
  1440. FileStream fs = File.Create(filename);
  1441. fs.Close();
  1442. var CmdCode = new byte[255];
  1443. using (StreamWriter file = new StreamWriter(filename))
  1444. {
  1445. //命令字
  1446. ushort ID = Command.ID;
  1447. //类型
  1448. byte Type = Command.Type;
  1449. //命令字
  1450. ushort Cmd = Command.Command;
  1451. CmdCode[0] = (byte)(Cmd >> 8);
  1452. CmdCode[1] = (byte)(Cmd & 0xFF);
  1453. //数据
  1454. for (int i = 0; i < Command.Data.Count; i++)
  1455. {
  1456. CmdCode[2 + 2 * i] = (byte)(Command.Data[i] & 0xFF);
  1457. CmdCode[3 + 2 * i] = (byte)(Command.Data[i] >> 8);
  1458. }
  1459. //写入文件
  1460. file.WriteLine("[" + inputFilename + "]");
  1461. file.WriteLine(CmdCode_To_CmdSave(ID, Type, CmdCode));
  1462. }
  1463. }
  1464. }
  1465. //输入任意字符退出
  1466. Console.WriteLine("转换完成,输入任意键结束!");
  1467. Console.ReadKey();
  1468. }
  1469. }
  1470. }