Dali Light Addressing: ทำอย่างไร?

Oct 15 2020

ในขณะที่ฉันกำลังพยายามสร้างโปรแกรมที่จัดการกับโคมไฟต่างๆฉันอยากรู้ว่าในทางทฤษฎีไม่ใช่คำสั่งที่ต้องให้ แต่ทำไมฉันถึงให้คำสั่งเฉพาะนั้น
ฉันค้นหามานานแล้วเพื่อหาตัวอย่างเกี่ยวกับคำสั่งแสงที่อยู่กับ Dali2
จากนั้นฉันก็พบบทความที่บอกฉันว่าฉันต้องป้อนคำสั่งบางอย่างสองครั้งเพื่อให้ Dali เข้าใจพวกเขา

นี่คือสิ่งที่ฉันได้อ่าน:

ตามมาตรฐาน IEC 60929 DALI Master ต้องทำซ้ำหลายคำสั่งภายใน 100ms เพื่อให้ DALI-Slaves ดำเนินการ

คำถามของฉันสำหรับคุณคือ:

  1. ฉันต้องทำซ้ำคำสั่งใดในโปรแกรมจึงจะมีผล
  2. คำสั่งใดที่ฉันควรเคารพ
  3. จะดีกว่าไหมถ้าฉันใช้ state automaton process type หรือ buffering?
  4. ทำไมต้องทำซ้ำคำสั่ง?

ฉันใช้ไมโครโปรเซสเซอร์ Stm32 ดังนั้นรหัสของฉันจะต้องเบาและมีประสิทธิภาพมากที่สุดเท่าที่จะทำได้

คำตอบ

2 Martin Oct 15 2020 at 21:13

คำสั่งการกำหนดค่าจะต้องทำซ้ำสองครั้งภายใน 100 มิลลิวินาทีโดยไม่มีคำสั่งอื่นใดอยู่ระหว่างก่อนที่อุปกรณ์ควบคุมจะยอมรับ นี่เป็นวิธีหนึ่งในการหลีกเลี่ยงความเสียหายของสัญญาณหรือข้อความปลอมโดยไม่ได้ตั้งใจเปลี่ยนการกำหนดค่า เฟรม DALI ได้รับการเข้ารหัสแมนเชสเตอร์ซึ่งป้องกันการพลิกบิตของเฟรมทำให้เกิดการตีความที่มีปัญหา แต่ไม่มี CRC ซึ่งเป็นรูปแบบทั่วไปของการตรวจจับข้อผิดพลาดในการสื่อสารแบบอนุกรม ดังนั้นจึงมีประโยชน์ที่จะมีวิธีการอื่นเพื่อให้แน่ใจว่าได้รับคำสั่งที่ตั้งใจไว้

รายการคำสั่งที่ต้องทำซ้ำจะได้รับในเอกสารใด ๆ ที่คุณมีบน DALI รวมถึง IEC 60929 ที่ถูกแทนที่ในขณะนี้ซึ่งระบุว่าต้องทำซ้ำคำสั่ง 32-128 และคำสั่งพิเศษบางคำสั่งเช่น Initialise และ Randomise มาตรฐานใหม่คือ IEC62386 และมีตาราง (ตารางที่ 15 ใน IEC62386-102 Ed 2) ซึ่งแสดงคำสั่งที่ต้องทำซ้ำ คอลัมน์นี้เรียกว่า "ส่งสองครั้ง"

ลำดับของคำสั่งขึ้นอยู่กับตรรกะของแอปพลิเคชันของคุณและกฎสำหรับข้อความ DALI ที่กำหนดไว้ในมาตรฐาน ตัวอย่างเช่นในการตั้งค่าพารามิเตอร์คอนฟิกูเรชันจะต้องโอนย้ายโดยใช้ทะเบียนการถ่ายโอนข้อมูล DTR (หรือ DTR1, DTR2) ก่อนจากนั้นจัดเก็บ - การทำเช่นนี้ในลำดับที่ตรงกันข้ามก็ไม่สมเหตุสมผล ตัวอย่างเช่นในการตั้งค่าระดับสูงสุดคำสั่งคือ 42, opcode byte 0x2A และใช้ DTR0 ดังนั้นชุดคำสั่งคือ

Command 257, SET DTR0 [with whatever value you want as a byte]
-any delay you like here-
Command 42, SET MAX LEVEL (DTR0) [addressed to the gear as necessary]
-less than 100ms delay-
Command 42, SET MAX LEVEL (DTR0) [addressed to the gear as necessary]

คำสั่ง 257 SET DTR0 ไม่ได้รับการแก้ไขดังนั้นจะใช้กับทุกเกียร์ที่เชื่อมต่อกับบัสและเปิดเครื่อง หากคุณต้องการให้ SET MAX LEVEL ถูกนำไปใช้กับเกียร์ Short Addressed เพียงชุดเดียวหรือที่อยู่ของกลุ่มหรือการออกอากาศสิ่งนั้นจะส่งผลต่อไบต์ที่อยู่ที่คุณต้องตั้งค่าใน Command 42 SET MAX LEVEL เฉพาะเกียร์ที่ตรงกับที่อยู่เท่านั้นจึงจะใช้ DTR เพื่อตั้งค่าพารามิเตอร์ MAX LEVEL ของตัวเอง

การทำซ้ำคำสั่งกำหนดค่าไม่ได้ทำอะไรเลยเพื่อให้แน่ใจว่าค่า DTR ในเฟืองถูกต้อง หากคุณมีเกียร์ที่ระบุระยะสั้นหรือมีเพียงเกียร์เดียวบนบัสคุณสามารถอ่าน DTR ย้อนหลังก่อนหรือหลังทำคำสั่ง SET เพื่อให้แน่ใจว่าอยู่ในค่าที่ถูกต้อง (โดยทั่วไปคุณไม่สามารถอ่านค่าย้อนกลับด้วยการสืบค้นแบบกระจายข้อมูลหรือแบบกลุ่มได้เนื่องจากการชนกันระหว่างชุดควบคุมหลายชุดเว้นแต่คุณจะใช้การสืบค้นข้อมูลเฉพาะประเภทอุปกรณ์และมีเพียงตัวอย่างเดียวเท่านั้นบนบัส)