ประเด็นหลักหรือบทความนี้เกี่ยวกับอะไร
หัวข้อของบทความคือการเขียนโปรแกรม Visual PLC ชิโอไทนี่ สำหรับบ้านอัจฉริยะที่อธิบายไว้ที่นี่:
สั้นๆ แนวคิดเช่น นอต, การสื่อสาร, การพัฒนารวมถึงคุณสมบัติของการโหลดและการรันโปรแกรมภาพ ESP8266ซึ่งเป็นพื้นฐานของ PLC ชิโอไทนี่.
บทนำหรือคำถามสองสามข้อเกี่ยวกับองค์กร
ในบทความก่อนหน้านี้เกี่ยวกับการพัฒนาของฉัน ฉันได้ให้ภาพรวมคร่าวๆ เกี่ยวกับความสามารถของคอนโทรลเลอร์ ชิโอไทนี่.
น่าแปลกที่สาธารณชนแสดงความสนใจอย่างมากและถามคำถามฉันค่อนข้างมาก เพื่อนบางคนถึงกับเสนอให้ซื้อคอนโทรลเลอร์จากฉันทันที ไม่ ฉันไม่ได้ต่อต้านการหาเงินเล็กๆ น้อยๆ แต่มโนธรรมของฉันไม่อนุญาตให้ฉันขายสิ่งที่ยังหยาบคายมากในแง่ของซอฟต์แวร์
ดังนั้นฉันจึงโพสต์ไบนารีของเฟิร์มแวร์และไดอะแกรมอุปกรณ์บน GitHub:
ตอนนี้ทุกคนสามารถแฟลช ESP-07 และเล่นกับเฟิร์มแวร์ได้ด้วยตัวเอง หากใครต้องการบอร์ดแบบเดียวกับในรูปจริงๆ ผมก็มีอยู่หลายอัน เขียนทางอีเมล [ป้องกันอีเมล]. แต่อย่างที่ Ogurtsov ที่น่าจดจำเคยกล่าวไว้ว่า: "ฉันไม่รับผิดชอบอะไรเลย!"
เอาล่ะเรามาถึงประเด็น: คืออะไร "ปม" (โหนด) และ "เหตุการณ์"? โปรแกรมดำเนินการอย่างไร?
ตามปกติเรามาเริ่มกันตามลำดับ: โดยการดาวน์โหลดโปรแกรม
โหลดโปรแกรมยังไงครับ
เริ่มจากสิ่งที่เกิดขึ้นเมื่อเรากดปุ่ม อัพโหลด ในเครื่องมือแก้ไข เอลวาด และโปรแกรมวงจรของเราซึ่งประกอบด้วยสี่เหลี่ยมที่สวยงามก็บินเข้าไปในอุปกรณ์
ประการแรก ตามแผนภาพที่เราวาด คำอธิบายในรูปแบบข้อความจะถูกสร้างขึ้น
ประการที่สอง จะตรวจสอบว่าอินพุตโหนดทั้งหมดเชื่อมต่อกับเอาต์พุตหรือไม่ ไม่ควรมีทางเข้าที่ "ห้อย" หากตรวจพบอินพุตดังกล่าว วงจรจะไม่ถูกโหลดเข้าสู่ ShioTiny และโปรแกรมแก้ไขจะแสดงคำเตือนที่เกี่ยวข้อง
หากทุกอย่างเป็นไปด้วยดี ตัวแก้ไขจะส่งคำอธิบายข้อความของวงจรทีละโหนดไปที่ ShIoTiny แน่นอนว่าวงจรที่มีอยู่จาก ShioTiny จะถูกลบออกก่อน คำอธิบายข้อความที่ได้จะถูกจัดเก็บไว้ในหน่วยความจำ FLASH
อย่างไรก็ตาม หากคุณต้องการถอดวงจรออกจากอุปกรณ์ ก็เพียงแค่โหลดวงจรว่างเข้าไป (ไม่มีองค์ประกอบโหนดเดียว)
เมื่อโหลดโปรแกรมวงจรทั้งหมดลงใน ShioTiny PLC แล้ว โปรแกรมจะเริ่ม "ดำเนินการ" มันหมายความว่าอะไร?
โปรดทราบว่ากระบวนการโหลดวงจรจากหน่วยความจำ FLASH เมื่อเปิดเครื่องและเมื่อรับวงจรจากตัวแก้ไขจะเหมือนกัน
ขั้นแรก ออบเจ็กต์โหนดจะถูกสร้างขึ้นตามคำอธิบาย
จากนั้นทำการเชื่อมต่อระหว่างโหนด นั่นคือการเชื่อมโยงของเอาต์พุตไปยังอินพุตและอินพุตไปยังเอาต์พุตจะถูกสร้างขึ้น
และหลังจากทั้งหมดนี้ วงจรการทำงานของโปรแกรมหลักก็เริ่มต้นขึ้นเท่านั้น
ฉันเขียนมาเป็นเวลานาน แต่กระบวนการทั้งหมดตั้งแต่ "การโหลด" วงจรจากหน่วยความจำ FLASH ไปจนถึงการเริ่มวงจรหลัก - ใช้เวลาเสี้ยววินาทีสำหรับวงจร 60-80 โหนด
ลูปหลักทำงานอย่างไร ง่ายมาก. ก่อนอื่นเขารอการปรากฏตัว การพัฒนา ที่โหนดใดโหนดหนึ่ง จากนั้นจึงประมวลผลเหตุการณ์นั้น และต่อๆ ไปอย่างไม่สิ้นสุด หรือจนกว่าพวกเขาจะอัปโหลดรูปแบบใหม่ไปที่ ShioTiny
หลายครั้งแล้วที่ฉันได้กล่าวถึงสิ่งต่าง ๆ เช่น การพัฒนา, นอต и การสื่อสาร. แต่นี่คืออะไรจากมุมมองของซอฟต์แวร์? เราจะพูดถึงเรื่องนี้ในวันนี้
โหนด การเชื่อมต่อ และเหตุการณ์
เพียงดูตัวอย่างโปรแกรมวงจรสำหรับ ชิโอไทนี่เพื่อทำความเข้าใจว่าแผนภาพประกอบด้วยสองเอนทิตีเท่านั้น - โหนด (หรือองค์ประกอบ) และการเชื่อมต่อระหว่างกัน
ปม, แต่ใช่ หรือ องค์ประกอบวงจร เป็นการเป็นตัวแทนเสมือนจริงของบางคน กิจกรรม เหนือข้อมูล นี่อาจเป็นการดำเนินการทางคณิตศาสตร์ การดำเนินการเชิงตรรกะ หรือการดำเนินการอื่นๆ ที่อยู่ในใจของเรา สิ่งสำคัญคือโหนดมีทางเข้าและทางออก
ทางเข้า - นี่คือสถานที่ที่โหนดรับข้อมูล รูปภาพอินพุตคือจุดที่ด้านซ้ายของโหนดเสมอ
เอาท์พุต - นี่คือสถานที่ที่ดึงผลลัพธ์ของการทำงานของโหนด ภาพที่ส่งออกคือจุดที่อยู่ทางด้านขวาของโหนดเสมอ
บางโหนดไม่มีอินพุต โหนดดังกล่าวสร้างผลลัพธ์ภายใน ตัวอย่างเช่น โหนดคงที่หรือโหนดเซ็นเซอร์: ไม่ต้องการข้อมูลจากโหนดอื่นเพื่อรายงานผลลัพธ์
ในทางกลับกัน โหนดอื่นไม่มีเอาต์พุต เหล่านี้เป็นโหนดที่แสดง เช่น แอคชูเอเตอร์ (รีเลย์หรือสิ่งที่คล้ายกัน) พวกเขายอมรับข้อมูลแต่ไม่สร้างผลลัพธ์การคำนวณที่โหนดอื่นสามารถใช้ได้
นอกจากนี้ยังมีโหนดความคิดเห็นที่ไม่ซ้ำใครอีกด้วย มันไม่ทำอะไรเลย ไม่มีอินพุตหรือเอาท์พุต มีวัตถุประสงค์เพื่อใช้เป็นคำอธิบายในแผนภาพ
เกิดอะไรขึ้น "เหตุการณ์"? เหตุการณ์ คือการเกิดขึ้นของข้อมูลใหม่ในโหนดใดๆ ตัวอย่างเช่น เหตุการณ์ต่างๆ ได้แก่: การเปลี่ยนแปลงสถานะอินพุต (node อินพุต) รับข้อมูลจากอุปกรณ์อื่น (nodes MQTT и UDP) การหมดอายุของระยะเวลาที่กำหนด (nodes เครื่องจับเวลา и ความล่าช้า) และอื่นๆ
กิจกรรมมีไว้เพื่ออะไร? ใช่ เพื่อพิจารณาว่าโหนดใดมีข้อมูลใหม่เกิดขึ้น และต้องเปลี่ยนสถานะของโหนดใดที่เกี่ยวข้องกับการรับข้อมูลใหม่ เหตุการณ์ดังกล่าวจะ "ผ่าน" ไปตามห่วงโซ่ของโหนดจนกว่าจะข้ามโหนดทั้งหมดที่ต้องตรวจสอบและเปลี่ยนแปลงสถานะ
โหนดทั้งหมดสามารถแบ่งออกเป็นสองประเภท
มาเรียกโหนดที่สามารถสร้างเหตุการณ์กันเถอะ "โหนดที่ใช้งานอยู่'
เราจะเรียกโหนดที่ไม่สามารถสร้างเหตุการณ์ได้”โหนดแบบพาสซีฟ'
เมื่อโหนดสร้างเหตุการณ์ (นั่นคือ ข้อมูลใหม่ปรากฏขึ้นที่เอาต์พุต) ในกรณีทั่วไป สถานะของสายโซ่ทั้งหมดของโหนดที่เชื่อมต่อกับเอาต์พุตของโหนดตัวสร้างเหตุการณ์จะเปลี่ยนไป
เพื่อให้ชัดเจนลองพิจารณาตัวอย่างในรูป
โหนดที่ใช้งานอยู่ที่นี่คือ Input1, Input2 และ Input3 โหนดที่เหลือเป็นแบบพาสซีฟ ลองพิจารณาว่าจะเกิดอะไรขึ้นเมื่อมีการปิดอินพุตหนึ่งหรืออีกอินพุตหนึ่ง เพื่อความสะดวกจะมีการสรุปผลลัพธ์เป็นตาราง
อย่างที่คุณเห็น เมื่อมีเหตุการณ์เกิดขึ้น ห่วงโซ่จะถูกสร้างขึ้นจากโหนดต้นทางของเหตุการณ์ไปยังโหนดปลาย สถานะของโหนดที่ไม่อยู่ในสายโซ่จะไม่เปลี่ยนแปลง
คำถามที่ถูกต้องเกิดขึ้น: จะเกิดอะไรขึ้นหากเหตุการณ์สองเหตุการณ์หรือหลายเหตุการณ์เกิดขึ้นพร้อมกัน?
ในฐานะผู้ชื่นชอบผลงานของ Gleb Anfilov ฉันจึงอยากส่งผู้ถามที่อยากรู้อยากเห็นไปที่หนังสือของเขาเรื่อง Escape from Surprise นี่คือ “ทฤษฎีสัมพัทธภาพสำหรับเด็กเล็ก” ซึ่งอธิบายได้ดีว่า “พร้อมกัน” หมายถึงอะไร และจะใช้ชีวิตร่วมกับทฤษฎีนั้นได้อย่างไร
แต่ในทางปฏิบัติแล้ว ทุกอย่างง่ายกว่ามาก: เมื่อมีเหตุการณ์สองเหตุการณ์หรือหลายเหตุการณ์เกิดขึ้น ห่วงโซ่ทั้งหมดจากแหล่งที่มาของเหตุการณ์แต่ละแห่งจะถูกสร้างขึ้นและประมวลผลตามลำดับตามลำดับ และไม่มีปาฏิหาริย์เกิดขึ้น
คำถามที่ถูกต้องตามกฎหมายถัดไปจากผู้อ่านที่อยากรู้อยากเห็นคือจะเกิดอะไรขึ้นหากโหนดเชื่อมต่อกับวงแหวน? หรืออย่างที่พวกเขาพูดในหมู่คนฉลาดเหล่านี้ว่าให้แนะนำข้อเสนอแนะ นั่นคือเชื่อมต่อเอาต์พุตของโหนดใดโหนดหนึ่งเข้ากับอินพุตของโหนดก่อนหน้าเพื่อให้สถานะเอาต์พุตของโหนดนี้ส่งผลต่อสถานะของอินพุต ตัวแก้ไขจะไม่อนุญาตให้คุณเชื่อมต่อเอาต์พุตของโหนดกับอินพุตโดยตรง เอลวาด. แต่ทางอ้อมดังรูปด้านล่างก็สามารถทำได้
แล้วจะเกิดอะไรขึ้นในกรณีนี้? คำตอบจะ "ชัดเจน" มาก ขึ้นอยู่กับว่าโหนดใด ลองดูตัวอย่างในรูป
เมื่อหน้าสัมผัสอินพุตของ Input1 เปิดอยู่ อินพุตด้านบนของโหนด A จะเป็น 0 เอาต์พุตของโหนด A ก็เป็น 0 เช่นกัน เอาต์พุตของโหนด B คือ 1 และสุดท้าย อินพุตด้านล่างของโหนด A คือ 1 ทุกอย่างเป็น ชัดเจน. และสำหรับผู้ที่ไม่ชัดเจน โปรดดูคำอธิบายด้านล่างว่าโหนด "AND" และ "NOT" ทำงานอย่างไร
ตอนนี้เราปิดหน้าสัมผัสของอินพุต Input1 นั่นคือเราใช้อันหนึ่งกับอินพุตด้านบนของโหนด A ผู้ที่คุ้นเคยกับอุปกรณ์อิเล็กทรอนิกส์รู้ดีว่าอันที่จริงเราจะได้วงจรเครื่องกำเนิดไฟฟ้าแบบคลาสสิกโดยใช้องค์ประกอบลอจิก และตามทฤษฎีแล้ว วงจรดังกล่าวควรสร้างลำดับ 1-0-1-0-1-0 อย่างไม่มีที่สิ้นสุด... ที่เอาท์พุตขององค์ประกอบ A และ B และ 0-1-0-1-0-1-…. ท้ายที่สุดกิจกรรมจะต้องเปลี่ยนสถานะของโหนด A และ B อย่างต่อเนื่องโดยวิ่งเป็นวงกลม 2-3-2-3-...!
แต่ในความเป็นจริงสิ่งนี้ไม่ได้เกิดขึ้น วงจรจะตกอยู่ในสถานะสุ่ม - หรือรีเลย์จะยังคงเปิดหรือปิดอยู่ หรืออาจจะเปิดและปิดเล็กน้อยติดต่อกันหลายครั้ง ทุกอย่างขึ้นอยู่กับสภาพอากาศที่ขั้วโลกใต้ของดาวอังคาร และนั่นคือสาเหตุว่าทำไมสิ่งนี้ถึงเกิดขึ้น
เหตุการณ์จากโหนด Input1 จะเปลี่ยนสถานะของโหนด A จากนั้นโหนด B และอื่นๆ ในลักษณะวงกลมหลายครั้ง โปรแกรมตรวจจับ "การวนซ้ำ" ของงานและบังคับให้หยุดงานรื่นเริงนี้ หลังจากนี้ การเปลี่ยนแปลงในสถานะของโหนด A และ B จะถูกบล็อกจนกว่าจะมีเหตุการณ์ใหม่เกิดขึ้น ช่วงเวลาที่โปรแกรมตัดสินใจว่า "หยุดหมุนเป็นวงกลม!" - โดยทั่วไปจะขึ้นอยู่กับหลายปัจจัยและถือว่าสุ่มได้
ระวังเมื่อเชื่อมต่อปมเข้ากับวงแหวน - เอฟเฟกต์จะไม่ชัดเจนเสมอไป! มีความคิดที่ดีว่าคุณกำลังทำอะไรและทำไม!
เป็นไปได้ไหมที่จะสร้างเครื่องกำเนิดไฟฟ้าบนโหนดที่เรามีอยู่? ใช่คุณสามารถ! แต่สิ่งนี้ต้องการโหนดที่สามารถสร้างเหตุการณ์ได้เอง และมีโหนดดังกล่าว - นี่คือ "เส้นหน่วงเวลา" เรามาดูกันว่าเครื่องกำเนิดไฟฟ้าที่มีระยะเวลา 6 วินาทีทำงานอย่างไรในรูปด้านล่าง
องค์ประกอบสำคัญของตัวสร้างคือโหนด A - เส้นหน่วงเวลา หากคุณเปลี่ยนสถานะอินพุตของเส้นหน่วงเวลาจาก 0 เป็น 1 ดังนั้น 1 จะไม่ปรากฏที่เอาต์พุตทันที แต่หลังจากเวลาที่กำหนดเท่านั้น ในกรณีของเราคือ 3 วินาที ในทำนองเดียวกัน หากคุณเปลี่ยนสถานะอินพุตของเส้นหน่วงเวลาจาก 1 เป็น 0 0 ที่เอาต์พุตจะปรากฏขึ้นหลังจาก 3 วินาทีเดียวกัน เวลาหน่วงกำหนดไว้ที่หนึ่งในสิบของวินาที นั่นคือค่า 30 หมายถึง 3 วินาที
คุณสมบัติพิเศษของเส้นล่าช้าคือสร้างเหตุการณ์หลังจากหมดเวลาล่าช้าแล้ว
สมมติว่าในตอนแรกเอาต์พุตของเส้นหน่วงเวลาคือ 0 หลังจากผ่านโหนด B - อินเวอร์เตอร์ - 0 นี่จะกลายเป็น 1 และไปที่อินพุตของเส้นหน่วงเวลา ไม่มีอะไรเกิดขึ้นทันที ที่เอาต์พุตของเส้นหน่วงเวลา จะยังคงเป็น 0 แต่การนับถอยหลังของเวลาหน่วงจะเริ่มขึ้น ผ่านไป 3 วินาที จากนั้นเส้นหน่วงเวลาจะสร้างเหตุการณ์ ที่เอาต์พุตจะปรากฏ 1 หน่วยนี้หลังจากผ่านโหนด B - อินเวอร์เตอร์ - เปลี่ยนเป็น 0 และไปที่อินพุตของเส้นหน่วงเวลา ผ่านไปอีก 3 วินาที... และกระบวนการก็เกิดขึ้นซ้ำ นั่นคือทุกๆ 3 วินาทีสถานะของเอาต์พุตบรรทัดล่าช้าจะเปลี่ยนจาก 0 เป็น 1 และจาก 1 เป็น 0 รีเลย์จะคลิก เครื่องกำเนิดไฟฟ้ากำลังทำงาน ระยะเวลาพัลส์คือ 6 วินาที (3 วินาทีที่เอาต์พุตเป็นศูนย์และ 3 วินาทีที่เอาต์พุตหนึ่ง)
แต่ในวงจรจริง มักจะไม่จำเป็นต้องใช้ตัวอย่างนี้ มีโหนดตัวจับเวลาพิเศษที่สมบูรณ์แบบและไม่มีภายนอกช่วยสร้างลำดับของพัลส์ในช่วงเวลาที่กำหนด ระยะเวลาของ "ศูนย์" และ "หนึ่ง" ในพัลส์เหล่านี้จะเท่ากับครึ่งหนึ่งของระยะเวลา
หากต้องการตั้งค่าการดำเนินการเป็นระยะ ให้ใช้โหนดตัวจับเวลา
ฉันสังเกตว่าสัญญาณดิจิทัลดังกล่าวซึ่งมีระยะเวลา "ศูนย์" และ "หนึ่ง" เท่ากันเรียกว่า "คดเคี้ยว"
ฉันหวังว่าฉันจะอธิบายคำถามให้กระจ่างขึ้นเล็กน้อยเกี่ยวกับวิธีการแพร่กระจายเหตุการณ์ระหว่างโหนดและสิ่งที่ไม่ควรทำ
บทสรุปและการอ้างอิง
บทความนี้กลายเป็นบทความสั้น ๆ แต่บทความนี้เป็นคำตอบสำหรับคำถามที่เกิดขึ้นเกี่ยวกับโหนดและเหตุการณ์ต่างๆ
เมื่อเฟิร์มแวร์พัฒนาขึ้นและมีตัวอย่างใหม่ปรากฏขึ้น ฉันจะเขียนเกี่ยวกับวิธีการตั้งโปรแกรม ชิโอไทนี่ บทความเล็กๆ ตราบเท่าที่มันจะน่าสนใจสำหรับผู้คน
เช่นเดิม ไดอะแกรม เฟิร์มแวร์ ตัวอย่าง คำอธิบายส่วนประกอบและทุกอย่าง
คำถาม ข้อเสนอแนะ คำวิจารณ์ - ไปที่นี่: [ป้องกันอีเมล]
ที่มา: will.com